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 | } |