Exemplo n.º 1
0
        public static LVector2 GetIntersectPoint(LVector2 p0, LVector2 p1, LVector2 p2, LVector2 p3)
        {
            var diff = p2 - p0;
            var d1   = p1 - p0;
            var d2   = p3 - p2;
            var demo = LMath.Cross2D(d1, d2);     //det

            if (LMath.Abs(demo) < LFloat.EPSILON) //parallel
            {
                return(p0);
            }

            var t1 = LMath.Cross2D(diff, d2) / demo; // Cross2D(diff,-d2)

            return(p0 + (p1 - p0) * t1);
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="o">射线的起点</param>
        /// <param name="d1">射线的终点</param>
        /// <param name="p2">多边形的顶点</param>
        /// <param name="p3">多边形相邻的顶点(和p2 组成线段)</param>
        /// <returns>返回大于等于0时  说明相交</returns>
        public static LFloat TestRaySegment(LVector2 o, LVector2 d1, LVector2 p2, LVector2 p3)
        {
            LVector2 diff = p2 - o;
            LVector2 d2   = p3 - p2;
            // 叉乘的结果如过为0  说明平行
            LFloat dome = LMath.Cross2D(d1, d2);

            if (LMath.Abs(dome) < LFloat.EPSILON)
            {
                return(LFloat.negOne);
            }
            LFloat t1 = LMath.Cross2D(d2, diff);
            LFloat t2 = LMath.Cross2D(d1, diff);

            if (t1 >= 0 && (t2 >= 0 && t2 <= 1))
            {
                return(t1);
            }
            return(LFloat.negOne);
        }
Exemplo n.º 3
0
        public static LFloat TestSegmentSegment(LVector2 p0, LVector2 p1, LVector2 p2, LVector2 p3)
        {
            LVector2 diff = p2 - p0;
            LVector2 d1   = p1 - p0;
            LVector2 d2   = p3 - p2;

            var demo = LMath.Cross2D(d1, d2);

            if (LMath.Abs(demo) < LFloat.EPSILON) //parallel
            {
                return(LFloat.negOne);
            }

            var t1 = LMath.Cross2D(d2, diff) / demo; // Cross2D(diff,-d2)
            var t2 = LMath.Cross2D(d1, diff) / demo; //Dot(v1,pd0) == cross(d0,d1)

            if ((t1 >= 0 && t1 <= 1) && (t2 >= 0 && t2 <= 1))
            {
                return(t1); // return p0 + (p1-p0) * t1
            }
            return(LFloat.negOne);
        }