]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackpart.cpp
Fix remaining exception class names
[r2c2.git] / source / libr2c2 / trackpart.cpp
index af2cf37999f23dd376ae5cb134149a90c18d4b22..2b3809dd7809d1b31bdea92ca5ca6e73a83430d0 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2006-2010  Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
 #include <cmath>
 #include "trackpart.h"
 
@@ -43,12 +36,12 @@ TrackPoint TrackPart::get_point(float d) const
                float s = sin(a);
                float rx = radius*sin(dir);
                float ry = -radius*cos(dir);
-               result.pos = Point(pos.x+c*rx-s*ry-rx, pos.y+c*ry+s*rx-ry);
+               result.pos = Vector(pos.x+c*rx-s*ry-rx, pos.y+c*ry+s*rx-ry);
                result.dir = dir+a;
        }
        else
        {
-               result.pos = Point(pos.x+cos(dir)*d, pos.y+sin(dir)*d);
+               result.pos = Vector(pos.x+cos(dir)*d, pos.y+sin(dir)*d);
                result.dir = dir;
        }
 
@@ -88,10 +81,37 @@ void TrackPart::check_link(TrackPart &other)
 TrackPart *TrackPart::get_link(unsigned i) const
 {
        if(i>=2)
-               throw InvalidParameterValue("Index out of range");
+               throw out_of_range("TrackPart::get_link");
        return links[i];
 }
 
+bool TrackPart::collide_ray(const Vector &start, const Vector &ray, float width) const
+{
+       Vector local_start(start.x-pos.x, start.y-pos.y, start.z);
+       float c = cos(dir);
+       float s = sin(dir);
+       local_start = Vector(c*local_start.x+s*local_start.y, c*local_start.y-s*local_start.x, local_start.z);
+       Vector local_ray(c*ray.x+s*ray.y, c*ray.y-s*ray.x, ray.z);
+
+       float d = -local_start.z/local_ray.z;
+       if(d<0)
+               return false;
+
+       Vector base(local_start.x+d*local_ray.x, local_start.y+d*local_ray.y);
+
+       if(radius)
+       {
+               base.y -= radius;
+               if(radius<0)
+                       base.y = -base.y;
+               float r = sqrt(base.x*base.x+base.y*base.y)-abs(radius);
+               float a = atan2(base.x, -base.y);
+               return (a>=0 && a<=length && r>=-width/2 && r<=width/2);
+       }
+       else
+               return (base.x>=0 && base.x<=length && base.y>=-width/2 && base.y<=width/2);
+}
+
 
 TrackPart::Loader::Loader(TrackPart &p):
        Msp::DataFile::BasicLoader<TrackPart>(p)
@@ -120,7 +140,7 @@ void TrackPart::Loader::finish()
 
 void TrackPart::Loader::start(float x, float y, float d)
 {
-       obj.pos = Point(x, y);
+       obj.pos = Vector(x, y);
        obj.dir = d;
 }