//MN - прямая, ABC - точка //принадлежность точки к отрезку прямой Point4D intersectionPointLine(Point4D M, Point4D N, Point4D A, double eps) { if (checkPointBelongLine(M, N, A, eps)) { return(A); } else { if (A.Equals(M) || A.Equals(N)) { return(A); } } return(null); }
//MN - точка, ABC - точка //Совпадение точек Point4D intersectionPoints(Point4D M, Point4D A) { if (M.Equals(A)) { return(M); } return(null); }
public Section4D pointsTIntersection(Point4D M, Point4D N, Point4D A, Point4D B, Point4D C, double eps) { if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 0) { if (checkLineBelongFlat(M, N, A, B, C) == 1) { statusMessage = "Прямая лежит на плоскости"; return(new Section4D(M, N)); } } //if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 1) // if (checkSameLines(M, N, A, B, eps) == 1 || checkSameLines(M, N, A, C, eps) == 1 || checkSameLines(M, N, B, C, eps) == 1) // { // statusMessage = "Прямая лежит на прямой"; // return new Section4D(M, N); // } if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 1) { if (checkSameLines(M, N, A, B, eps) == 1 && !A.Equals(B)) { statusMessage = "Прямая лежит на прямой"; return(new Section4D(M, N)); } if (checkSameLines(M, N, A, C, eps) == 1 && !A.Equals(C)) { statusMessage = "Прямая лежит на прямой"; return(new Section4D(M, N)); } if (checkSameLines(M, N, B, C, eps) == 1 && !B.Equals(C)) { statusMessage = "Прямая лежит на прямой"; return(new Section4D(M, N)); } } return(null); }
bool checkPointBelongLine(Point4D M, Point4D N, Point4D A, double eps) { if (M.Equals(A) || N.Equals(A)) { return(true); } double t = Math.Abs(calculateCosVectors(N.X - M.X, N.Y - M.Y, N.Z - M.Z, N.W - M.W, A.X - M.X, A.Y - M.Y, A.Z - M.Z, A.W - M.W)); return(1 - eps < t && t < 1 + eps); }
//MN - прямая, ABC - прямая //пересечение двух прямых Point4D intersectionLines(Point4D M, Point4D N, Point4D A, Point4D B, double eps) { if (checkСrossLines(M, N, A, B) == 0 && checkSameLines(M, N, A, B, eps) == 0 && checkParallelLines(M, N, A, B, eps) == 0 && !A.Equals(B)) { Point4D Vector = calculateCompositionVectors(B.X - A.X, B.Y - A.Y, B.Z - A.Z, N.X - M.X, N.Y - M.Y, N.Z - M.Z); Point4D Z = new Point4D(Vector.X + A.X, Vector.Y + A.Y, Vector.Z + A.Z, 1); Point4D T = intersectionFlatLine(M, N, A, B, Z, eps); return(T); } return(null); }
//вырожденность плоскости в точку (проверка) bool checkFlatAtPoint(Point4D A, Point4D B, Point4D C) { return(A.Equals(B) && B.Equals(C)); }
///////////////////////////////////////////////////////////////////////////////////////////////////// public Point4D pointTIntersection(Point4D M, Point4D N, Point4D A, Point4D B, Point4D C, double eps, ref Label mesABC, ref Label mesMN) { Point4D T = null; if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 0) { mesABC.Text = "Плоскость ABC"; mesMN.Text = "Прямая MN"; T = intersectionFlatLine(M, N, A, B, C, eps); if (T != null) { statusMessage = "Пересечение прямой с плоскостью"; } else { if (checkLineParallelFlat(M, N, A, B, C, eps) == 1) { statusMessage = "Прямая и плоскость параллельны"; } else { statusMessage = "Прямая и плоскость не пересекаются"; } } return(T); } if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 1) { if (A.Equals(B)) { mesABC.Text = "Прямая AC(BC)"; } if (A.Equals(C)) { mesABC.Text = "Прямая AB(BC)"; } if (B.Equals(C)) { mesABC.Text = "Прямая AB(AC)"; } mesMN.Text = "Прямая MN"; if (intersectionLines(M, N, A, B, eps) != null) { statusMessage = "Прямые MN и AB пересекаютcя"; return(intersectionLines(M, N, A, B, eps)); } else { statusMessage = "Прямые MN и AB не пересекаются"; } if (intersectionLines(M, N, B, C, eps) != null) { statusMessage = "Прямые MN и BC пересекаютcя"; return(intersectionLines(M, N, B, C, eps)); } else { statusMessage = "Прямые MN и BC не пересекаются"; } if (intersectionLines(M, N, A, C, eps) != null) { statusMessage = "Прямые MN и AC пересекаютcя"; return(intersectionLines(M, N, A, C, eps)); } else { statusMessage = "Прямые MN и AC не пересекаются"; } if (checkParallelLines(M, N, A, B, eps) == 1 && !A.Equals(B)) { statusMessage = "Прямые MN и AB параллельны"; } if (checkParallelLines(M, N, A, C, eps) == 1 && !A.Equals(C)) { statusMessage = "Прямые MN и AC параллельны"; } if (checkParallelLines(M, N, B, C, eps) == 1 && !B.Equals(C)) { statusMessage = "Прямые MN и BC параллельны"; } if (checkСrossLines(M, N, A, B) == 1) { statusMessage = "Прямые MN и AB скрещиваются"; } if (checkСrossLines(M, N, A, C) == 1) { statusMessage = "Прямые MN и AC скрещиваются"; } if (checkСrossLines(M, N, B, C) == 1) { statusMessage = "Прямые MN и BC скрещиваются"; } } if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 2) { mesABC.Text = "Точка A(B, C)"; mesMN.Text = "Прямая MN"; T = intersectionPointLine2(M, N, A, eps); if (T != null) { statusMessage = "Пересечение прямой с точкой"; } else { statusMessage = "Прямая и точка не пересекаются"; } return(T); } if (checkDegenLine(M, N) == 1 && checkDegenFlat(A, B, C) == 0) { mesABC.Text = "Плоскость ABC"; mesMN.Text = "Точка M(N)"; T = intersectionPointFlat(M, A, B, C); if (T != null) { statusMessage = "Пересечение точки с плоскостью"; } else { statusMessage = "Точка и плоскость не пересекаются"; } return(T); } if (checkDegenLine(M, N) == 1 && checkDegenFlat(A, B, C) == 1) { if (A.Equals(B)) { mesABC.Text = "Прямая AC(BC)"; } if (A.Equals(C)) { mesABC.Text = "Прямая AB(BC)"; } if (B.Equals(C)) { mesABC.Text = "Прямая AB(AC)"; } mesMN.Text = "Точка M(N)"; if (intersectionPointLine(A, B, M, eps) != null) { T = intersectionPointLine(A, B, M, eps); } if (intersectionPointLine(B, C, M, eps) != null) { T = intersectionPointLine(B, C, M, eps); } if (intersectionPointLine(A, C, N, eps) != null) { T = intersectionPointLine(A, C, N, eps); } if (T != null) { statusMessage = "Пересечение прямой с точкой"; } else { statusMessage = "Прямая и точка не пересекаются"; } return(T); } if (checkDegenLine(M, N) == 1 && checkDegenFlat(A, B, C) == 2) { mesABC.Text = "Точка A(B, C)"; mesMN.Text = "Точка M(N)"; T = intersectionPoints(M, A); if (T != null) { statusMessage = "Пересечение двух точек"; } else { statusMessage = "Две точки не пересекаются"; } return(T); } //statusMessage = ""; return(null); }