/// <summary> /// 判断两条线段是否相交 /// 现在有线段AB和线段CB //用线段AB的方向和C,D两点分别做差乘比较。如果C,D在同侧则return跳出 //用线段CD的方向和A,B两点分别做差乘比较。如果A,B在同侧则return跳出 //最终返回相交 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <param name="c"></param> /// <param name="d"></param> /// <returns></returns> static bool IsTwoSegmentIntersection(Vector2L a2d, Vector2L b2d, Vector2L c2d, Vector2L d2d) { Vector3L a = new Vector3L(a2d.x, 0, a2d.y); Vector3L b = new Vector3L(b2d.x, 0, b2d.y); Vector3L c = new Vector3L(c2d.x, 0, c2d.y); Vector3L d = new Vector3L(d2d.x, 0, d2d.y); var crossA = FixPointMath.Sign(Vector3L.Cross(d - c, a - c).y); var crossB = FixPointMath.Sign(Vector3L.Cross(d - c, b - c).y); if (FixPointMath.Approximately(crossA, crossB)) { return(false); } var crossC = FixPointMath.Sign(Vector3L.Cross(b - a, c - a).y); var crossD = FixPointMath.Sign(Vector3L.Cross(b - a, d - a).y); if (FixPointMath.Approximately(crossC, crossD)) { return(false); } return(true); }
public static FloatL MoveTowards(FloatL current, FloatL target, FloatL maxDelta) { if (FixPointMath.Abs(target - current) <= maxDelta) { return(target); } return(current + FixPointMath.Sign(target - current) * maxDelta); }