public bool IsPointInPoly(VectorF point) { int i, j; bool c = false; for (i = 0, j = Points.Count - 1; i < Points.Count; i++) { switch (SimpleGeometry.GetEdgeType(point, Points[i] + Position, Points[j] + Position)) { case SimpleGeometry.EdgeType.TOUCHING: return(true); case SimpleGeometry.EdgeType.CROSSING: c = !c; break; } j = i; } return(c); }
public override bool IsCollision(Collision collision) { if (GetMacroCollisionRect().IsMacroCollision(collision.GetMacroCollisionRect()) == false) { return(false); } if (collision.GetType() == typeof(PolygonCollision)) { PolygonCollision poly = (PolygonCollision)collision; for (int i = 0, p = Points.Count - 1; i < Points.Count; i++) { for (int j = 0, q = poly.Points.Count - 1; j < poly.Points.Count; j++) { if (SimpleGeometry.IsIntersection(Points[i] + Position, Points[p] + Position, poly.Points[j] + poly.Position, poly.Points[q] + poly.Position)) { return(true); } q = j; } p = i; } return(IsPointInPoly(poly.Points[0] + poly.Position) || poly.IsPointInPoly(Points[0] + Position)); } else if (collision.GetType() == typeof(BoxCollision)) { BoxCollision box = (BoxCollision)collision; for (int i = 0, j = Points.Count - 1; i < Points.Count; i++) { if (SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position, box.Position + new VectorF(box.Size.X, 0)) || SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position + new VectorF(box.Size.X, 0), box.Position + box.Size) || SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position + box.Size, box.Position + new VectorF(0, box.Size.Y)) || SimpleGeometry.IsIntersection(Points[i] + Position, Points[j] + Position, box.Position + new VectorF(0, box.Size.Y), box.Position)) { return(true); } j = i; } return(IsPointInPoly(box.Position) || (((Points[0].X + Position.X) > box.Position.X) && ((Points[0].X + Position.X) < (box.Position.X + box.Size.X)) && ((Points[0].Y + Position.Y) > box.Position.Y) && ((Points[0].Y + Position.Y) < (box.Position.Y + box.Size.Y)))); } else if (collision.GetType() == typeof(CircleCollision)) { CircleCollision circle = (CircleCollision)collision; for (int i = 0, j = Points.Count - 1; i < Points.Count; i++) { if (SimpleGeometry.IsSegmentIntersectsWithCircle(circle.Center(), circle.Radius, Points[i] + Position, Points[j] + Position)) { return(true); } j = i; } return(IsPointInPoly(circle.Center()) || ((Points[0] + Position - circle.Center()).Length() < circle.Radius)); } else { return(collision.IsCollision(this)); } }