/// <summary> /// 点と三角形ポリゴンとの最短距離を返します /// </summary> /// <param name="anchorPoint">基準点</param> /// <param name="vertex1">三角形の頂点</param> /// <param name="vertex2">三角形の頂点</param> /// <param name="vertex3">三角形の頂点</param> /// <param name="location">基準点に対して最も近い三角形上の点</param> /// <returns></returns> public static float GetDistanceWithTriangle(Vector3 anchorPoint, Vector3 vertex1, Vector3 vertex2, Vector3 vertex3, out Vector3 location) { Vector3 edge2 = vertex2 - vertex1; Vector3 edge3 = vertex3 - vertex1; Vector3 triangleVert = Vector3.Normalize(Vector3.Cross(edge2, edge3)); Vector3 toAnchor = anchorPoint - vertex1; float vertDistance = Vector3.Dot(triangleVert, toAnchor); Vector3 testDir = -triangleVert * vertDistance * 2; Motion.Old.MotionDataLine vertLine = new Motion.Old.MotionDataLine(anchorPoint, testDir); float distance; if (GeometryCalc.GetCollisionTriangle(vertLine.End, vertLine.AnotherEnd, vertex1, vertex2, vertex3, out distance)) { location = anchorPoint + Vector3.Normalize(testDir) * distance; return(distance); } Vector3 location1, location2, location3; float distance1 = GeometryCalc.GetDistanceWithLine(anchorPoint, vertex1, vertex2, out location1); float distance2 = GeometryCalc.GetDistanceWithLine(anchorPoint, vertex2, vertex3, out location2); float distance3 = GeometryCalc.GetDistanceWithLine(anchorPoint, vertex3, vertex1, out location3); if (distance1 < distance2 && distance1 < distance3) { location = location1; return(distance1); } else if (distance2 < distance1 && distance2 < distance3) { location = location2; return(distance2); } else { location = location3; return(distance3); } }