fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. double Mixed(double ax, double ay, double az, double bx, double by, double bz, double cx, double cy, double cz){
  5. return (ax*by*cz)+(ay*bz*cx)+(az*bx*cy)-(az*by*cx)-(ay*bx*cz)-(ax*bz*cy); // Формула смешаного произведения, если = 0, то одна плоскость
  6. }
  7.  
  8. bool Collinear(double ax, double bx, double ay, double by, double az, double bz){
  9. return ((ax/bx) == (ay/by) && (ay/by) == (az/bz)) ? true:false; // Коллинеарность
  10. }
  11.  
  12. bool VectorEquation(double x, double x0, double y, double y0, double z, double z0, double Vx, double Vy, double Vz){
  13. return (x - x0)/Vx == (y - y0)/Vy && (y - y0)/Vy == (z - z0)/Vz ? true:false; // уравнение прямой в пространстве
  14. }
  15.  
  16. double Min(double X1, double X2){
  17. return X1 < X2 ? X1:X2;
  18. }
  19. double Max(double X1, double X2){
  20. return X1 > X2 ? X1:X2;
  21. }
  22. bool CollinearforPerp(double ax, double ay, double az, double bx, double by, double bz){ // Условие коллинеарности при bx,by,bz=0
  23. return ((ay*bz-az*by == 0) && (az*bx-ax*by == 0) && (ax*by-ay*bx == 0)) ? true:false;
  24. }
  25.  
  26. // 0/0 ?
  27.  
  28.  
  29. int main() {
  30. double Xa, Ya, Za, Xb, Yb, Zb, Xc, Yc, Zc, Xd, Yd, Zd; // Координаты концов отрезков
  31. cin >> Xa >> Ya >> Za >> Xb >> Yb >> Zb >> Xc >> Yc >> Zc >> Xd >> Yd >> Zd;
  32. double VectorABx, VectorABy, VectorABz, VectorCDx, VectorCDy, VectorCDz, VectorACx, VectorACy, VectorACz; //Координаты векторов
  33.  
  34. VectorABx = Xb-Xa;
  35. VectorABy = Yb-Ya;
  36. VectorABz = Zb-Za;
  37.  
  38. VectorCDx = Xd-Xc;
  39. VectorCDy = Yd-Yc;
  40. VectorCDz = Zd-Zc;
  41.  
  42. VectorACx = Xc-Xa;
  43. VectorACy = Yc-Ya;
  44. VectorACz = Zc-Za;
  45.  
  46. if (Mixed(VectorABx, VectorABy, VectorABz, VectorCDx, VectorCDy, VectorCDz, VectorACx, VectorACy, VectorACz) == 0){ // Смешанное произведение
  47. if(Xc == Xd || Yc == Yd || Zc == Zd){ // Частный случай, если прямая перпендикулярна какой-либо оси
  48. if(CollinearforPerp(VectorABx,VectorABy,VectorABz,VectorCDx,VectorCDy,VectorCDz)){ // Прямые Коллинеарны
  49. if((Xc == Xd && Xa != Xc) || (Yc == Yd && Ya != Yc) || (Zc == Zd && Za != Zd)){ // Условие параллельности
  50. cout << "Прямые параллельны" << endl;
  51. }
  52. else{
  53. if(((Min(Xa,Xb) <= Xc && Max(Xa,Xb) >= Xc) ||(Min(Xa,Xb) <= Xd && Max(Xa,Xb) >= Xd))||(((Min(Xc,Xd) <= Xa && Max(Xc,Xd) >= Xa) ||(Min(Xc,Xd) <= Xb && Max(Xc,Xd) >= Xb)))){
  54. if(((Min(Ya,Yb) <= Yc && Max(Ya,Yb) >= Yc) ||(Min(Ya,Yb) <= Yd && Max(Ya,Yb) >= Yd))||(((Min(Yc,Yd) <= Ya && Max(Yc,Yd) >= Ya) ||(Min(Yc,Yd) <= Yb && Max(Yc,Yd) >= Yb)))){
  55. if(((Min(Za,Zb) <= Zc && Max(Za,Zb) >= Zc) ||(Min(Za,Zb) <= Yd && Max(Za,Zb) >= Zd))||(((Min(Zc,Zd) <= Za && Max(Zc,Zd) >= Ya) ||(Min(Zc,Zd) <= Zb && Max(Zc,Zd) >= Zb)))){
  56. cout << "Отрезки совпадают" << endl; // Пресечение отрезков
  57. }
  58. else cout << "Отрезки находятся на одной прямой но не совпадают" << endl;
  59. }
  60. else cout << "Отрезки находятся на одной прямой но не совпадают" << endl;
  61. }
  62. else cout << "Отрезки находятся на одной прямой но не совпадают" << endl;
  63. }
  64. }
  65. else{
  66. if(((Min(Xa,Xb) <= Xc && Max(Xa,Xb) >= Xc) ||(Min(Xa,Xb) <= Xd && Max(Xa,Xb) >= Xd))||(((Min(Xc,Xd) <= Xa && Max(Xc,Xd) >= Xa) ||(Min(Xc,Xd) <= Xb && Max(Xc,Xd) >= Xb)))){
  67. if(((Min(Ya,Yb) <= Yc && Max(Ya,Yb) >= Yc) ||(Min(Ya,Yb) <= Yd && Max(Ya,Yb) >= Yd))||(((Min(Yc,Yd) <= Ya && Max(Yc,Yd) >= Ya) ||(Min(Yc,Yd) <= Yb && Max(Yc,Yd) >= Yb)))){
  68. if(((Min(Za,Zb) <= Zc && Max(Za,Zb) >= Zc) ||(Min(Za,Zb) <= Yd && Max(Za,Zb) >= Zd))||(((Min(Zc,Zd) <= Za && Max(Zc,Zd) >= Ya) ||(Min(Zc,Zd) <= Zb && Max(Zc,Zd) >= Zb)))){
  69. cout << "Отрезки пересекаются" << endl;
  70. }
  71. else cout << "Отрезки не пересекаются" << endl;
  72. }
  73. else cout << "Отрезки не пересекаются" << endl;
  74. }
  75. else cout << "Отрезки не пересекаются" << endl;
  76. }
  77. return 0;
  78. }
  79. else{
  80. if (Collinear(VectorABx, VectorCDx, VectorABy, VectorCDy, VectorABz, VectorCDz)){ // Прямые коллинеарны
  81. if(VectorEquation(Xa, Xc, Ya, Yc, Za, Zc, VectorCDx, VectorCDy, VectorCDz)){ // Совпадение прямых
  82. if((Min(Xa,Xb) <= Xc && Max(Xa,Xb) >= Xc) ||(Min(Xa,Xb) <= Xd && Max(Xa,Xb) >= Xd)){ // Совпадение отрезков
  83. cout<< "Отрезки совпадают" << endl;
  84. }
  85. else{
  86. cout << "Отрезки на одной прямой но не совпадают" << endl;
  87. }
  88. }
  89. else{
  90. cout << "Прямые параллельны" << endl;
  91. }
  92. }
  93. else{
  94. if(((Min(Xa,Xb) <= Xc && Max(Xa,Xb) >= Xc) || (Min(Xa,Xb) <= Xd && Max(Xa,Xb) >= Xd))||(((Min(Xc,Xd) <= Xa && Max(Xc,Xd) >= Xa) ||(Min(Xc,Xd) <= Xb && Max(Xc,Xd) >= Xb)))){
  95. cout << "Отрезки пересекаются" << endl;
  96. }
  97. else cout << "Отрезки не пересекаются" << endl;
  98. }
  99. }
  100. }
  101. else{
  102. cout << "Прямые в разных плоскостях" << endl;
  103. }
  104. return 0;
  105. }
Success #stdin #stdout 0s 3468KB
stdin
0 0 0    1 0 0    1 0 0   2 0 0
stdout
Отрезки совпадают