C#碰撞math帮助

我正在MonoGame中进行自己的碰撞检测。 我有一个PolyLine类有一个属性来返回该PolyLine实例的法线。 我有一个具有List LineSegments的ConvexPolySprite类。 我有一个CircleSprite类,它有一个Center属性和一个Radius属性。 我正在使用一个静态类的碰撞检测方法。 我正在一条线段上testing它。 Vector2(200,0)=> Vector2(300,200)

问题是它检测到沿着太空中的任何地方发生的碰撞。 我无法弄清楚为什么。 提前致谢;

在这里输入图像说明

在这里输入图像说明

在这里输入图像说明

public class PolyLine { //--------------------------------------------------------------------------------------------------------------------------- // Class Properties /// <summary> /// Property for the upper left-hand corner of the owner of this instance /// </summary> public Vector2 ParentPosition { get; set; } /// <summary> /// Relative start point of the line segment /// </summary> public Vector2 RelativeStartPoint { get; set; } /// <summary> /// Relative end point of the line segment /// </summary> public Vector2 RelativeEndPoint { get; set; } /// <summary> /// Property that gets the absolute position of the starting point of the line segment /// </summary> public Vector2 AbsoluteStartPoint { get { return ParentPosition + RelativeStartPoint; } }//end of AbsoluteStartPoint /// <summary> /// Gets the absolute position of the end point of the line segment /// </summary> public Vector2 AbsoluteEndPoint { get { return ParentPosition + RelativeEndPoint; } }//end of AbsoluteEndPoint public Vector2 NormalizedLeftNormal { get { Vector2 P = AbsoluteEndPoint - AbsoluteStartPoint; P.Normalize(); float x = PX; float y = PY; return new Vector2(-y, x); } }//end of NormalizedLeftNormal //--------------------------------------------------------------------------------------------------------------------------- // Class Constructors /// <summary> /// Sole ctor /// </summary> /// <param name="parentPosition"></param> /// <param name="relStart"></param> /// <param name="relEnd"></param> public PolyLine(Vector2 parentPosition, Vector2 relStart, Vector2 relEnd) { ParentPosition = parentPosition; RelativeEndPoint = relEnd; RelativeStartPoint = relStart; }//end of ctor }//end of PolyLine class public static bool Collided(CircleSprite circle, ConvexPolygonSprite poly) { var distance = Vector2.Dot(circle.Position - poly.LineSegments[0].AbsoluteEndPoint, poly.LineSegments[0].NormalizedLeftNormal) + circle.Radius; if (distance <= 0) { return false; } else { return true; } }//end of collided 

对我来说,看起来像一个无限的线,而不是一个线段相交的代码。 这是确定从圆心到线上最近点的距离,如果小于圆半径,则是碰撞。 有多种方法可将其限制为线段,例如检查最近的点是否在线段内,或者使用线段的参数方程,并检查t是否在0到1的范围内。

交点的公式可以在网上find,例如: http : //mathworld.wolfram.com/Circle-LineIntersection.html