Пример #1
0
        /// <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);
            }
        }