X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftracktype.cpp;h=fe3a54cd824d7471cb78c95b47b8ba9ceb33e8df;hb=54392d65e2053d1eacb4cfcc435f1013993f2973;hp=3be1ecb364e8631a84ac216960bc154a82277510;hpb=2910db1364914c0ab98a0f80250cc39137821577;p=r2c2.git diff --git a/source/libr2c2/tracktype.cpp b/source/libr2c2/tracktype.cpp index 3be1ecb..fe3a54c 100644 --- a/source/libr2c2/tracktype.cpp +++ b/source/libr2c2/tracktype.cpp @@ -1,4 +1,5 @@ #include +#include #include "tracktype.h" using namespace std; @@ -76,9 +77,8 @@ TrackPoint TrackType::get_point(unsigned epi, unsigned path, float d) const for(unsigned j=0; jget_point(j ? i->get_length() : 0); - float dx = p.pos.x-endpoints[epi].pos.x; - float dy = p.pos.y-endpoints[epi].pos.y; - if(dx*dx+dy*dy<1e-6) + Vector span = p.pos-endpoints[epi].pos; + if(dot(span, span)<1e-6) { part = &*i; part_ep = j; @@ -98,7 +98,7 @@ TrackPoint TrackType::get_point(unsigned epi, unsigned path, float d) const d = plen-d; TrackPoint p = part->get_point(d); if(part_ep==1) - p.dir += M_PI; + p.dir += Angle::half_turn(); return p; } else @@ -132,15 +132,6 @@ TrackPoint TrackType::get_nearest_point(const Vector &p) const return result; } -bool TrackType::collide_ray(const Vector &start, const Vector &dir, float width) const -{ - for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - if(i->collide_ray(start, dir, width)) - return true; - - return false; -} - void TrackType::collect_endpoints() { endpoints.clear(); @@ -156,21 +147,16 @@ void TrackType::collect_endpoints() { TrackPoint p = i->get_point(j ? i->get_length() : 0); if(j==0) - p.dir += M_PI; + p.dir += Angle::half_turn(); bool found = false; for(vector::iterator k=endpoints.begin(); k!=endpoints.end(); ++k) { - float dx = k->pos.x-p.pos.x; - float dy = k->pos.y-p.pos.y; + Vector d = k->pos-p.pos; - float da = k->dir-p.dir; - while(da>M_PI) - da -= M_PI*2; - while(da<-M_PI) - da += M_PI*2; + Angle da = wrap_balanced(k->dir-p.dir); - if(dx*dx+dy*dy<1e-6 && da>-0.01 && da<0.01) + if(dot(d, d)<1e-6 && abs(da).radians()<0.01) { k->paths |= 1<get_path(); found = true; @@ -184,8 +170,8 @@ void TrackType::collect_endpoints() } } -TrackType::Endpoint::Endpoint(float x, float y, float d, unsigned p): - pos(x, y), +TrackType::Endpoint::Endpoint(float x, float y, const Angle &d, unsigned p): + pos(x, y, 0), dir(d), paths(p) { } @@ -204,6 +190,13 @@ TrackType::Loader::Loader(TrackType &t): void TrackType::Loader::finish() { obj.collect_endpoints(); + vector shapes; + for(vector::iterator i=obj.parts.begin(); i!=obj.parts.end(); ++i) + { + i->create_shape(); + shapes.push_back(&i->get_shape()); + } + obj.shape = Geometry::Union::from_iterator_range(shapes.begin(), shapes.end()).clone(); } void TrackType::Loader::part()