static bool PolygonCollision(PolygonForCollision polygonA, PolygonForCollision polygonB) { bool Intersect = true; int edgeCountA = polygonA.Edges.Count; int edgeCountB = polygonB.Edges.Count; VectorForCollision edge; for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++) { if (edgeIndex < edgeCountA) { edge = polygonA.Edges[edgeIndex]; } else { edge = polygonB.Edges[edgeIndex - edgeCountA]; } VectorForCollision axis = new VectorForCollision(-edge.Y, edge.X); axis.Normalize(); float minA = 0; float minB = 0; float maxA = 0; float maxB = 0; ProjectPolygon(axis, polygonA, ref minA, ref maxA); ProjectPolygon(axis, polygonB, ref minB, ref maxB); if (IntervalDistance(minA, maxA, minB, maxB) > 0) { Intersect = false; } } return(Intersect); }
/// <summary> /// 서로 다른 두 다각형의 충돌 체크 /// </summary> /// <param name="poly1">다각형 1</param> /// <param name="poly2">다각형 2</param> /// <returns>충돌 여부</returns> public static bool CheckPolygon(PointF[] poly1, PointF[] poly2) { PolygonForCollision p1 = new PolygonForCollision(); PolygonForCollision p2 = new PolygonForCollision(); p1.Points.AddRange(poly1.Select(x => new VectorForCollision(x.X, x.Y))); p2.Points.AddRange(poly2.Select(x => new VectorForCollision(x.X, x.Y))); p1.BuildEdges(); p2.BuildEdges(); return(PolygonCollision(p1, p2)); }
static void ProjectPolygon(VectorForCollision axis, PolygonForCollision polygon, ref float min, ref float max) { float d = axis.DotProduct(polygon.Points[0]); min = d; max = d; for (int i = 0; i < polygon.Points.Count; i++) { d = polygon.Points[i].DotProduct(axis); if (d < min) { min = d; } else { if (d > max) { max = d; } } } }