public static CCPoint VectorFrom(float x, float y, CCPoint[] vertices, out int pointIndexBefore) { pointIndexBefore = -1; double minDistance = double.PositiveInfinity; double tempMinDistance; CCPoint vectorToReturn = new CCPoint(); if (vertices.Length == 1) { return new CCPoint( vertices[0].X - x, vertices[0].Y - y); } Segment connectingSegment = new Segment(); Segment segment = new Segment(); for (int i = 0; i < vertices.Length - 1; i++) { int afterI = i + 1; segment.Point1 = new CCPoint(vertices[i].X, vertices[i].Y); segment.Point2 = new CCPoint(vertices[afterI].X, vertices[afterI].Y); var point = new CCPoint (x, y); tempMinDistance = segment.DistanceTo(ref point, out connectingSegment); if (tempMinDistance < minDistance) { pointIndexBefore = i; minDistance = tempMinDistance; vectorToReturn = new CCPoint( connectingSegment.Point2.X - connectingSegment.Point1.X, connectingSegment.Point2.Y - connectingSegment.Point1.Y); } } return vectorToReturn; }
public bool CollideAgainst(Circle circle) { UpdateAbsolutePoints (); // This method will test the following things: // * Is the circle's center inside the polygon? // * Are any of the polygon's points inside the circle? // * Is the circle within Radius distance from any of the polygon's edges? // Of course none of this is done if the radius check fails if ((circle.Radius + boundingRadius) * (circle.Radius + boundingRadius) > (circle.PositionX - PositionX) * (circle.Position.X - Position.X) + (circle.PositionY - PositionY) * (circle.Position.Y - Position.Y)) { // First see if the circle is inside the polygon. if (IsPointInside(circle.PositionWorldspace.X, circle.PositionWorldspace.Y)) { LastCollisionPoint.X = circle.Position.X; LastCollisionPoint.Y = circle.Position.Y; return true; } int i; // Next see if any of the Polygon's points are inside the circle for (i = 0; i < absolutePoints.Length; i++) { if (circle.IsPointInside(absolutePoints[i])) { LastCollisionPoint.X = absolutePoints[i].X; LastCollisionPoint.Y = absolutePoints[i].Y; return true; } } int k; Segment s1 = new Segment(); Segment s2 = new Segment(); // Next check if the circle is within Radius units of any segment. for (i = 0; i < absolutePoints.Length; i++) { k = i + 1 < absolutePoints.Length ? i + 1 : 0; s1.Point1 = absolutePoints [i]; s1.Point2 = absolutePoints[k]; var position = circle.PositionWorldspace; var segmentDistance = s1.DistanceTo (ref position, out s2); if (segmentDistance < circle.Radius) { LastCollisionPoint.X = s2.Point2.X; LastCollisionPoint.Y = s2.Point2.Y; return true; } } } return false; }
public bool CollideAgainst(Circle circle) { UpdateAbsolutePoints(); // This method will test the following things: // * Is the circle's center inside the polygon? // * Are any of the polygon's points inside the circle? // * Is the circle within Radius distance from any of the polygon's edges? // Of course none of this is done if the radius check fails if ((circle.Radius + boundingRadius) * (circle.Radius + boundingRadius) > (circle.PositionX - PositionX) * (circle.Position.X - Position.X) + (circle.PositionY - PositionY) * (circle.Position.Y - Position.Y)) { // First see if the circle is inside the polygon. if (IsPointInside(circle.PositionWorldspace.X, circle.PositionWorldspace.Y)) { LastCollisionPoint.X = circle.Position.X; LastCollisionPoint.Y = circle.Position.Y; return(true); } int i; // Next see if any of the Polygon's points are inside the circle for (i = 0; i < absolutePoints.Length; i++) { if (circle.IsPointInside(absolutePoints[i])) { LastCollisionPoint.X = absolutePoints[i].X; LastCollisionPoint.Y = absolutePoints[i].Y; return(true); } } int k; Segment s1 = new Segment(); Segment s2 = new Segment(); // Next check if the circle is within Radius units of any segment. for (i = 0; i < absolutePoints.Length; i++) { k = i + 1 < absolutePoints.Length ? i + 1 : 0; s1.Point1 = absolutePoints [i]; s1.Point2 = absolutePoints[k]; var position = circle.PositionWorldspace; var segmentDistance = s1.DistanceTo(ref position, out s2); if (segmentDistance < circle.Radius) { LastCollisionPoint.X = s2.Point2.X; LastCollisionPoint.Y = s2.Point2.Y; return(true); } } } return(false); }