-void Manipulator::update_wrap()
-{
- wrap.clear();
- float min_x = 0, max_x = 0;
- float min_y = 0, max_y = 0;
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- Track3D &t3d = designer.get_layout_3d()->get_track(*i->track);
-
- TrackWrap tw;
- float min_area = 100;
- for(float a=0; a<M_PI; a+=0.01)
- {
- Point minp, maxp;
- t3d.get_bounds(a, minp, maxp);
- float area = (maxp.x-minp.x)*(maxp.y-minp.y);
- if(area<min_area)
- {
- float c = cos(a);
- float s = sin(a);
- float x = (minp.x+maxp.x)/2;
- float y = (minp.y+maxp.y)/2;
- tw.pos = Point(c*x-s*y, s*x+c*y, (minp.z+maxp.z)/2);
- tw.rot = a;
- tw.width = maxp.x-minp.x+0.01;
- tw.height = maxp.y-minp.y+0.01;
-
- min_area = area;
- }
- }
-
- if(i==tracks.begin())
- {
- min_x = max_x = tw.pos.x;
- min_y = max_y = tw.pos.y;
- }
- else
- {
- min_x = min(min_x, tw.pos.x);
- max_x = max(max_x, tw.pos.x);
- min_y = min(min_y, tw.pos.y);
- max_y = max(max_y, tw.pos.y);
- }
- wrap.push_back(tw);
- }
-
- center = Point((min_x+max_x)/2, (min_y+max_y)/2, 0);
- wrap_pos = center;
- wrap_rot = 0;
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- const Point &tp = i->track->get_position();
- i->pos = Point(tp.x-center.x, tp.y-center.y, tp.z);
- }
- for(list<TrackWrap>::iterator i=wrap.begin(); i!=wrap.end(); ++i)
- {
- i->pos.x -= center.x;
- i->pos.y -= center.y;
- }
-}
-
-void Manipulator::update_neighbors()
-{
- neighbors.clear();
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- const vector<Track *> &links = i->track->get_links();
- for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
- {
- if(!*j)
- continue;
- if(neighbors.count(*j))
- continue;
-
- bool ok = true;
- for(vector<MTrack>::iterator k=tracks.begin(); (k!=tracks.end() && ok); ++k)
- ok = (k->track!=*j);
-
- if(ok)
- neighbors.insert(*j);
- }
- }
-}
-
-void Manipulator::set_slope(TrackOrder &track, float z, float dz)
-{
- const Point &p = track.track->get_position();
- if(track.rev)
- {
- track.track->set_position(Point(p.x, p.y, z+dz));
- track.track->set_slope(-dz);
- }
- else
- {
- track.track->set_position(Point(p.x, p.y, z));
- track.track->set_slope(dz);
- }
-}