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