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