示例#1
0
        public static void PlaneTransformGlobaleTriangle(Vector3 p1, Vector3 p2, Vector3 p3, GeoPlane plane, out Vector2 p11, out Vector2 p21, out Vector2 p31)
        {
            Vector3 p1t = plane.TransformToGlobal(p1);
            Vector3 p2t = plane.TransformToGlobal(p2);
            Vector3 p3t = plane.TransformToGlobal(p3);

            p11 = new Vector2(p1t.x, p1t.z);
            p21 = new Vector2(p2t.x, p2t.z);
            p31 = new Vector2(p3t.x, p3t.z);
        }
        public static bool IsTriangleInsectPlaneCircle2(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 center, float r, GeoPlane plane, ref GeoInsectPointArrayInfo insect)
        {
            Vector3 p11 = plane.TransformToLocal(p1);
            Vector3 p21 = plane.TransformToLocal(p2);
            Vector3 p31 = plane.TransformToLocal(p3);
            Vector3 c1  = plane.TransformToLocal(center);
            Vector2 p12 = new Vector2(p11.x, p11.z);
            Vector2 p22 = new Vector2(p21.x, p21.z);
            Vector2 p32 = new Vector2(p31.x, p31.z);
            Vector2 c2  = new Vector2(c1.x, c1.z);
            GeoInsectPointArrayInfo temp = new GeoInsectPointArrayInfo();
            bool isInsect1 = IsTriangleInsectCircle2(p12, p22, p32, c2, r, ref temp);

            if (isInsect1)
            {
                insect.mIsIntersect = true;
                foreach (Vector3 v in temp.mHitGlobalPoint.mPointArray)
                {
                    Vector3 vv = new Vector3(v.x, 0.0f, v.y);
                    vv = plane.TransformToGlobal(vv);
                    insect.mHitGlobalPoint.mPointArray.Add(vv);
                }
                return(true);
            }
            return(false);
        }
示例#3
0
        public static List <Vector3> PlaneTransformGlobal(List <Vector2> ps, GeoPlane plane)
        {
            List <Vector3> tmp = new List <Vector3>();

            foreach (Vector3 p in ps)
            {
                Vector3 v = new Vector3(p.x, 0.0f, p.y);
                tmp.Add(plane.TransformToGlobal(v));
            }
            return(tmp);
        }
        public static float PointClosest2PlaneTriangle2(Vector3 p1, Vector3 p2, Vector3 p3, GeoPlane plane, ref Vector3 p, ref Vector3 close)
        {
            Vector2 p11, p21, p31, pt;

            GeoPlaneUtils.PlaneTransformLocalTriangle(p1, p2, p3, plane, out p11, out p21, out p31);
            Vector3 pp = plane.TransformToLocal(p);

            pt = new Vector2(pp.x, pp.z);
            Vector2 close1 = new Vector2();
            float   d      = PointClosest2Triangle2(p11, p21, p31, ref pt, ref close1);

            close.x = close1.x;
            close.y = 0;
            close.z = close1.y;
            close   = plane.TransformToGlobal(close);
            return(d);
        }
        public static float PointClosest2PlaneAABB2(Vector3 min, Vector3 max, GeoPlane plane, ref Vector3 p, ref Vector3 close1)
        {
            Vector3 min1  = plane.TransformToLocal(min);
            Vector3 max1  = plane.TransformToLocal(max);
            Vector3 p1    = plane.TransformToLocal(p);
            Vector2 min2  = new Vector2(min1.x, min1.z);
            Vector2 max2  = new Vector2(max1.x, max1.z);
            Vector2 p2    = new Vector2(p1.x, p1.z);
            Vector2 close = new Vector2();
            float   temp  = PointClosest2AABB2(min2, max2, ref p2, ref close);

            if (p1.y != 0)
            {
                temp = Mathf.Sqrt(temp * temp + p1.y * p1.y);
            }
            p1     = new Vector3(close.x, 0.0f, close.y);
            close1 = plane.TransformToGlobal(p1);
            return(temp);
        }
        public static bool IsTriangleInsectCircle3(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 center, float r, GeoPlane plane, ref GeoInsectPointArrayInfo insect)
        {
            bool isInsect = GeoPlaneUtils.IsPlaneInsectTriangle(plane.mNormal, plane.mD, p1, p2, p3, ref insect);

            if (isInsect)
            {
                if (insect.mHitGlobalPoint.mPointArray.Count == 3) // 共面, 转化成 2d
                {
                    insect.Clear();
                    return(IsTriangleInsectPlaneCircle2(p1, p2, p3, center, r, plane, ref insect));
                }
                else if (insect.mHitGlobalPoint.mPointArray.Count == 1)
                {
                    if (GeoCircleUtils.IsInSphere(center, r, insect.mHitGlobalPoint.mPointArray[0]))
                    {
                        return(true);
                    }
                }
                else if (insect.mHitGlobalPoint.mPointArray.Count == 2)
                {
                    Vector3 seg1 = plane.TransformToLocal(insect.mHitGlobalPoint.mPointArray[0]);
                    Vector3 seg2 = plane.TransformToLocal(insect.mHitGlobalPoint.mPointArray[1]);
                    Vector3 c1   = plane.TransformToLocal(center);
                    Vector2 p12  = new Vector2(seg1.x, seg1.z);
                    Vector2 p22  = new Vector2(seg2.x, seg2.z);
                    Vector2 c2   = new Vector2(c1.x, c1.z);
                    insect.Clear();
                    GeoInsectPointArrayInfo temp = new GeoInsectPointArrayInfo();
                    if (GeoSegmentUtils.IsSegmentInsectCircle2(p12, p22, c2, r, ref temp))
                    {
                        insect.mIsIntersect = true;
                        foreach (Vector3 v in temp.mHitGlobalPoint.mPointArray)
                        {
                            Vector3 vv = new Vector3(v.x, 0.0f, v.y);
                            vv = plane.TransformToGlobal(vv);
                            insect.mHitGlobalPoint.mPointArray.Add(vv);
                        }
                        return(true);
                    }
                }
            }
            return(false);
        }
示例#7
0
        // 3 维 共面
        public static bool IsCircleInsectCirclePlane2(Vector3 center1, float r1, Vector3 center2, float r2, GeoPlane plane, ref GeoInsectPointArrayInfo insect)
        {
            Vector3 c1       = plane.TransformToLocal(center1);
            Vector3 c2       = plane.TransformToLocal(center2);
            bool    isInsect = IsCircleInsectCircle2(new Vector2(c1.x, c1.z), r1, new Vector2(c2.x, c2.z), r2, ref insect);

            if (isInsect)
            {
                List <Vector3> t3 = new List <Vector3>();
                foreach (Vector3 v in insect.mHitGlobalPoint.mPointArray)
                {
                    Vector3 tmp = new Vector3(v.x, 0.0f, v.y);
                    Vector3 glo = plane.TransformToGlobal(tmp);
                    t3.Add(glo);
                }
                insect.mIsIntersect = true;
                insect.mHitGlobalPoint.mPointArray = t3;
            }
            return(insect.mIsIntersect);
        }
        // 两三角面 共面的情况
        private static bool IsTriangleInsectTrianglePlane2(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, Vector3 p5, Vector3 p6, ref GeoInsectPointArrayInfo insect)
        {
            GeoPlane plane = GeoPlaneUtils.CreateFromTriangle(p1, p2, p3);
            Vector2  p11, p21, p31, p41, p51, p61;

            GeoPlaneUtils.PlaneTransformLocalTriangle(p1, p2, p3, plane, out p11, out p21, out p31);
            GeoPlaneUtils.PlaneTransformLocalTriangle(p4, p5, p6, plane, out p41, out p51, out p61);
            GeoInsectPointArrayInfo tmp = new GeoInsectPointArrayInfo();
            bool isInsect = IsTriangleInsectTriangle2(p11, p21, p31, p41, p51, p61, ref tmp);

            if (isInsect)
            {
                foreach (Vector3 v in tmp.mHitGlobalPoint.mPointArray)
                {
                    Vector3 vt = new Vector3(v.x, 0.0f, v.z);
                    vt = plane.TransformToGlobal(vt);
                    insect.mHitGlobalPoint.mPointArray.Add(vt);
                }
                insect.mIsIntersect = insect.mHitGlobalPoint.mPointArray.Count > 0;
            }
            return(insect.mIsIntersect);
        }
示例#9
0
 public static void PlaneTransformGlobaleTriangle(Vector3 p1, Vector3 p2, Vector3 p3, GeoPlane plane, out Vector3 p11, out Vector3 p21, out Vector3 p31)
 {
     p11 = plane.TransformToGlobal(p1);
     p21 = plane.TransformToGlobal(p2);
     p31 = plane.TransformToGlobal(p3);
 }