fork(1) download
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>//библиотека, содержащая функции min и max
  4. using namespace std;
  5. double perpendicularx(double x1,double y1, double x2, double y2, double x3, double y3) //функция, которая высчитывает значение абциссы проекции точки на прямую, содержащую отрезок
  6. {
  7. double x;
  8. x=(-x1*(y2-y1)*(y2-y1)+x3*(x2-x1)*(x2-x1)-y1*y2+y1*y1)/((x2-x1)*(x2-x1)-(y2-y1)*(y2-y1));
  9. return x;
  10. }
  11. double perpendiculary(double x1,double y1, double x2, double y2, double x3, double y3, double x)//функция, которая высчитывает значение абциссы проекции точки на прямую, содержащую отрезок
  12. {
  13. double y;
  14. y=(x-x1)*(y2-y1)/(x2-x1)+y1;
  15. return y;
  16. }
  17. int main() {
  18. double x, y, x1, x2, x3, x4, y1, y2, y3, y4, temp;
  19. cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
  20. double mini=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); //предположим, что минимальное значение, это расстояние от конца одного отрезка до конца другого
  21. temp=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); //для каждой пары концов разных отрезков высчитываем расстояние между ними
  22. if (temp<mini)//если оно меньше минимума
  23. mini=temp;//то меняем минимум
  24. temp=sqrt((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1));//повторяем для каждой пары концов разных отрезков
  25. if (temp<mini)
  26. mini=temp;
  27. temp=sqrt((x4-x2)*(x4-x2)+(y4-y2)*(y4-y2));
  28. if (temp<mini)
  29. mini=temp;
  30. x=perpendicularx(x1, y1, x2, y2, x3, y3);//получаем абциссу проекции конца одного отрезка на другой
  31. y=perpendiculary(x1, y1, x2, y2, x3, y3, x);//ординату
  32. if ((x2-x1)*(x2-x1)-(y2-y1)*(y2-y1)==0) //в случае, если равно нулю, абцисса будет равна бесконечности, а это возможно в том случае, если конец отрезка совпадает с его проекцией на другой отрезок
  33. {
  34. x=x3; // для корректных вычислений приравниваем абциссы и ординаты точки с её проекцией
  35. y=y3;
  36. }
  37. if (x>=min(x1,x2)&&x<=max(x1,x2)&&y>=min(y1,y2)&&y<=max(y1,y2)) //если проекция лежит на отрезке заданном
  38. {
  39. temp=sqrt((x3-x)*(x3-x)+(y3-y)*(y3-y));//то проверяем, будет ли расстояние от конца отрезка до её проекции меньше, чем текущий минимум
  40. if (temp<mini)
  41. mini=temp;//если да, то меняем значение минимума
  42. }
  43. x=perpendicularx(x1, y1, x2, y2, x4, y4); // далее повторяемя для трех других концов отрезков
  44. y=perpendiculary(x1, y1, x2, y2, x4, y4, x);
  45. if ((x2-x1)*(x2-x1)-(y2-y1)*(y2-y1)==0)
  46. {
  47. x=x4;
  48. y=y4;
  49. }
  50. if (x>=min(x1,x2)&&x<=max(x1,x2)&&y>=min(y1,y2)&&y<=max(y1,y2))
  51. {
  52. temp=sqrt((x4-x)*(x4-x)+(y4-y)*(y4-y));
  53. if (temp<mini)
  54. mini=temp;
  55. }
  56. x=perpendicularx(x3, y3, x4, y4, x1, y1);
  57. y=perpendiculary(x3, y3, x4, y4, x1, y1, x);
  58. if ((x4-x3)*(x4-x3)-(y4-y3)*(y4-y3)==0)
  59. {
  60. x=x1;
  61. y=y1;
  62. }
  63. if (x>=min(x3,x4)&&x<=max(x3,x4)&&y>=min(y3,y4)&&y<=max(y3,y4))
  64. {
  65. temp=sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
  66. if (temp<mini)
  67. mini=temp;
  68. }
  69. x=perpendicularx(x3, y3, x4, y4, x2, y2);
  70. y=perpendiculary(x3, y3, x4, y4, x2, y2, x);
  71. if ((x4-x3)*(x4-x3)-(y4-y3)*(y4-y3)==0)
  72. {
  73. x=x2;
  74. y=y2;
  75. }
  76. if (x>=min(x3,x4)&&x<=max(x3,x4)&&y>=min(y3,y4)&&y<=max(y3,y4))
  77. {
  78. temp=sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
  79. if (temp<mini)
  80. mini=temp;
  81. }
  82. cout<<mini<<endl; // выводим минимальное расстояние и переходим на новую строку
  83. return 0;
  84. }
Success #stdin #stdout 0s 3464KB
stdin
0 0 1 1 1 0 2 1

stdout
0