public static CrossResultRec GetCrossing(Vector2 p11, Vector2 p12, // координаты первого отрезка Vector2 p21, Vector2 p22) // координаты второго отрезка { CrossResultRec result = new CrossResultRec(); // знаменатель float Z = (p12.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p12.x - p11.x); // числитель 1 float Ca = (p12.y - p11.y) * (p21.x - p11.x) - (p21.y - p11.y) * (p12.x - p11.x); // числитель 2 float Cb = (p21.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p21.x - p11.x); // если числители и знаменатель = 0, прямые совпадают if ((Z == 0) && (Ca == 0) && (Cb == 0)) { result.type = enumCrossType.ctSameLine; return(result); } // если знаменатель = 0, прямые параллельны if (Z == 0) { result.type = enumCrossType.ctParallel; return(result); } float Ua = Ca / Z; float Ub = Cb / Z; result.pt.x = p11.x + (p12.x - p11.x) * Ub; result.pt.y = p11.y + (p12.y - p11.y) * Ub; // если 0<=Ua<=1 и 0<=Ub<=1, точка пересечения в пределах отрезков if ((0 <= Ua) && (Ua <= 1) && (0 <= Ub) && (Ub <= 1)) { if ((Ua == 0) || (Ua == 1) || (Ub == 0) || (Ub == 1)) { result.type = enumCrossType.ctOnBounds; } else { result.type = enumCrossType.ctInBounds; } } // иначе точка пересечения за пределами отрезков else { result.type = enumCrossType.ctOutBounds; } return(result); }
//************************************************************** // Crossing() // проверка пересечения двух отрезков //************************************************************** public static CrossResultRec Crossing( Vector2 p11, Vector2 p12, // координаты первого отрезка Vector2 p21, Vector2 p22) // координаты второго отрезка { CrossResultRec result = new CrossResultRec(); // знаменатель double Z = (p12.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p12.x - p11.x); // числитель 1 double Ca = (p12.y - p11.y) * (p21.x - p11.x) - (p21.y - p11.y) * (p12.x - p11.x); // числитель 2 double Cb = (p21.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p21.x - p11.x); // если числители и знаменатель = 0, прямые совпадают if ((Math.Abs(Z) < Tracer3D.GeometryEpsilon) && (Ca == 0) && (Cb == 0)) { result.type = EnumCrossType.ctSameLine; return(result); } // если знаменатель = 0, прямые параллельны if (Math.Abs(Z) < Tracer3D.GeometryEpsilon) { if (ThreePointOnTheLine(p11, p12, p21)) { result.type = EnumCrossType.ctOnLine; } else { result.type = EnumCrossType.ctParallel; } return(result); } double Ua = Ca / Z; double Ub = Cb / Z; result.pt = new Vector2(); result.pt.x = p11.x + (p12.x - p11.x) * Ub; result.pt.y = p11.y + (p12.y - p11.y) * Ub; // если 0<=Ua<=1 и 0<=Ub<=1, точка пересечения в пределах отрезков if ((0 <= Ua) && (Ua <= 1) && (0 <= Ub) && (Ub <= 1)) { if ((Ua == 0) || (Ua == 1) || (Ub == 0) || (Ub == 1)) { result.type = EnumCrossType.ctOnBounds; } else { result.type = EnumCrossType.ctInBounds; } } // иначе точка пересечения за пределами отрезков else { result.type = EnumCrossType.ctOutBounds; } return(result); }
// координаты второго отрезка //************************************************************** // Crossing() // проверка пересечения двух отрезков //************************************************************** public static CrossResultRec Crossing( Point3d p11, Point3d p12, // координаты первого отрезка Point3d p21, Point3d p22) { CrossResultRec result = new CrossResultRec(); // знаменатель float Z = (p12.Y - p11.Y) * (p21.X - p22.X) - (p21.X - p22.X) * (p12.X - p11.X); // числитель 1 float Ca = (p12.Y - p11.Y) * (p21.X - p11.X) - (p21.Y - p11.Y) * (p12.X - p11.X); // числитель 2 float Cb = (p21.Y - p11.Y) * (p21.X - p22.X) - (p21.Y - p22.Y) * (p21.X - p11.X); // если числители и знаменатель = 0, прямые совпадают if ((Z == 0) && (Ca == 0) && (Cb == 0)) { result.type = enumCrossType.ctSameLine; return result; } // если знаменатель = 0, прямые параллельны if (Z == 0) { result.type = enumCrossType.ctParallel; return result; } float Ua = Ca / Z; float Ub = Cb / Z; result.pt = new Point3d(); result.pt.X = (float)(p11.X + (p12.X - p11.X) * Ub); result.pt.Y = (float)(p11.Y + (p12.Y - p11.Y) * Ub); // если 0<=Ua<=1 и 0<=Ub<=1, точка пересечения в пределах отрезков if ((0 <= Ua) && (Ua <= 1) && (0 <= Ub) && (Ub <= 1)) { result.type = ((Ua == 0) || (Ua == 1) || (Ub == 0) || (Ub == 1)) ? enumCrossType.ctOnBounds : enumCrossType.ctInBounds; } // иначе точка пересечения за пределами отрезков else { result.type = enumCrossType.ctOutBounds; } return result; }