Subversion Repositories DIN Is Noise

Rev

Rev 2097 | Rev 2172 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
964 jag 1
/*
2
* rose_milker.cc
2097 jag 3
* DIN Is Noise is copyright (c) 2006-2024 Jagannathan Sampath
1713 jag 4
* DIN Is Noise is released under GNU Public License 2.0
1479 jag 5
* For more information, please visit https://dinisnoise.org/
964 jag 6
*/
7
 
8
 
9
#include "rose_milker.h"
10
#include "vector2d.h"
11
#include "ui_list.h"
12
#include "console.h"
13
#include <vector>
14
#include <fstream>
15
using namespace std;
16
 
17
extern ofstream dlog;
18
 
19
extern const float TWO_PI;
20
extern const float PI_BY_180;
21
 
22
extern curve_library sin_lib, cos_lib;
23
 
1185 jag 24
rose_milker::rose_milker () : scr (this, "rose_milker.scr", "rose_milker_sin.crv", "rose_milker_cos.crv", "rose_milker_radius.crv", "rose_milker_sin.ed", "rose_milker_cos.ed", "rose_milker_radius.ed", 0) {
964 jag 25
  name = "Rose_Milker";
26
  center.x = 0.5;
27
  center.y = 0;
28
  load_params ();
29
}
30
 
975 jag 31
void rose_milker::load_params () {
32
  ifstream f (make_fname().c_str(), ios::in);
33
  string ignore;
1540 jag 34
  f >> ignore >> N >> ignore >> D >> ignore >> num_points >> ignore >> angle.start >> ignore >> angle.end;
975 jag 35
}
964 jag 36
 
975 jag 37
void rose_milker::save_params () {
38
  ofstream f (make_fname().c_str(), ios::out);
39
  string ignore;
1540 jag 40
  f << "N " << N << endl << "D " << D << endl << "num_points " << num_points << endl << "start_angle " << angle.start << endl << "end_angle " << angle.end << endl;
975 jag 41
}
964 jag 42
 
975 jag 43
rose_milker::~rose_milker () {
44
  widget_save ("d_rose_milker", ctrls);
45
  save_params ();
46
}
964 jag 47
 
975 jag 48
void rose_milker::setup () {
964 jag 49
 
975 jag 50
  plugin::setup ();
964 jag 51
 
1540 jag 52
  widget* _ctrls [] = {&sp.N, &sp.D, &sp.num_points, &sp.angle.start, &sp.angle.end, &scr};
53
  for (int i = 0; i < 6; ++i) ctrls.push_back (_ctrls[i]);
54
 
975 jag 55
  num_ctrls = ctrls.size ();
964 jag 56
 
1540 jag 57
  spinner<int>* spn [] = {&sp.N, &sp.D, &sp.num_points};
975 jag 58
  const char* lbl [] = {"N", "D", "Points"};
999 jag 59
  int val [] = {N, D, num_points};
975 jag 60
  for (int i = 0; i < 3; ++i) {
61
    spinner<int>* spi = spn[i];
1485 jag 62
    spi->set (lbl[i], 1, 0, MILLION, this, 0);
975 jag 63
    spi->set_value (val[i]);
64
  }
1485 jag 65
 
1551 jag 66
  sp.angle.start.set ("Start angle", 1.0f, -MILLION, MILLION, this, 0);
1543 jag 67
  sp.angle.start.set_value (angle.start);
68
 
1551 jag 69
  sp.angle.end.set ("End angle", 1.0f, -MILLION, MILLION, this, 0);
1540 jag 70
  sp.angle.end.set_value (angle.end);
964 jag 71
 
975 jag 72
  widget_load ("d_rose_milker", ctrls);
964 jag 73
 
975 jag 74
  scr.setup ();
75
  scr.set_pos (cb_auto_apply.posx, cb_auto_apply.posy);
76
  sin_cos_radius_optioned ();
1485 jag 77
 
975 jag 78
  render ();
964 jag 79
 
975 jag 80
}
964 jag 81
 
975 jag 82
void rose_milker::render () {
964 jag 83
 
975 jag 84
  funktion& f_sin = *scr.pf_sin;
85
  funktion& f_cos = *scr.pf_cos;
964 jag 86
 
2108 jag 87
  N = sp.N.value;
88
  D = sp.D.value;
89
 
975 jag 90
  if (D == 0) return;
91
  K = N * 1. / D;
964 jag 92
 
2108 jag 93
  num_points = sp.num_points.value;
999 jag 94
  if (num_points == 0) return;
975 jag 95
 
2108 jag 96
  angle.start = sp.angle.start.value;
97
  angle.end = sp.angle.end.value;
98
 
1540 jag 99
  float dtheta = (angle.end - angle.start) / num_points * PI_BY_180;
100
  float theta = angle.start * PI_BY_180;
101
  float theta_k = theta;
999 jag 102
  int j = num_points + 1;
103
  points.resize (j);
996 jag 104
  float R;
1550 jag 105
  float ktheta;
999 jag 106
  for (int i = 0; i < j; ++i) {
1550 jag 107
    ktheta = K * theta_k;
975 jag 108
    while (ktheta > TWO_PI) ktheta -= TWO_PI;
109
    R = f_sin (ktheta);
110
    point<float>& pi = points[i];
111
    pi.x = center.x + R * f_cos (theta);
112
    pi.y = center.y + R * f_sin (theta);
113
    theta += dtheta;
114
    theta_k += dtheta;
115
    while (theta > TWO_PI) theta -= TWO_PI;
116
  }
978 jag 117
 
975 jag 118
  ss.str("");
1540 jag 119
  ss << "rose_" << N << "by" << D << "_" << (int)angle.end;
978 jag 120
 
121
  gen_pts ();
122
 
975 jag 123
}
124
 
964 jag 125
void rose_milker::sin_cos_radius_optioned () {
1540 jag 126
  do_render ();
964 jag 127
}
128
 
129
void rose_milker::sin_cos_radius_edited () {
1540 jag 130
  do_render ();
964 jag 131
}