did I fix the meshing now?
[antikythera] / src / machine.cc
index 81aa6f6..d6bb338 100644 (file)
@@ -105,11 +105,14 @@ void Machine::calc_meshing()
        // fix the initial angles so that teeth mesh as best as possible
        // should work in one pass as long as the gear train is not impossible
        for(int i=0; i<ngears; i++) {
-               gears[i]->init_angle = 0;
+               float rnd = gears[i]->angle + gears[i]->get_angular_pitch() / 2.0;
+               float snap = rnd - fmod(rnd, gears[i]->get_angular_pitch());
+               gears[i]->set_angle(snap);
+               gears[i]->set_angular_offset(0);
        }
 
        for(int i=0; i<ngears; i++) {
-               for(int j=1; j<ngears; j++) {
+               for(int j=i; j<ngears; j++) {
                        if(meshing[i][j]) {
                                assert(i != j);
 
@@ -122,16 +125,11 @@ void Machine::calc_meshing()
                                float delta = frac_j - frac_i;
 
                                float correction = 0.5 - delta;
-                               gears[j]->init_angle += correction * gears[j]->get_angular_pitch();
+                               float prev_offs = gears[j]->get_angular_offset();
+                               gears[j]->set_angular_offset(prev_offs + correction * gears[j]->get_angular_pitch());
                        }
                }
        }
-
-       /*
-       for(int i=0; i<ngears; i++) {
-               printf("init %d: %f\n", i, gears[i]->init_angle);
-       }
-       */
 }
 
 void Machine::update_gear(int idx, float angle)