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); }
/// <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); }
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); }