fork(11) download
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. double ras(double x1, double y1, double x2, double y2, double x3, double y3){
  6. double k,d;
  7. if(x1==x2){ //Если отрезок вертикальный - меняем местами координаты каждой точки.
  8. swap(x1, y1);
  9. swap(x2, y2);
  10. swap(x3, y3);
  11. }
  12. k=(y1-y2)/(x1-x2);//Ищем коэффициенты уравнения прямой, которому принадлежит данный отрезок.
  13. d=y1-k*x1;
  14. double xz=(x3*x2-x3*x1+y2*y3-y1*y3+y1*d-y2*d)/(k*y2-k*y1+x2-x1);
  15. double dl=-1;
  16. if((xz<=x2&&xz>=x1)||(xz<=x1&&xz>=x2)) dl=sqrt((x3-xz)*(x3-xz)+(y3-xz*k-d)*(y3-xz*k-d));//Проверим лежит ли основание высоты на отрезке.
  17. return dl;
  18. }
  19. int main() {
  20. double xa, xb, ya, yb, xc, xd, yc, yd, dl, dl1, dl2, dl3, dl4, min=-1,o,o1,o2,t=-2,s=-2;
  21. cin>>xa>>ya>>xb>>yb>>xc>>yc>>xd>>yd;
  22. o=(xb-xa)*(-yd+yc)-(yb-ya)*(-xd+xc);
  23. o1=(xb-xa)*(yc-ya)-(yb-ya)*(xc-xa);
  24. o2=(-yd+yc)*(xc-xa)-(-xd+xc)*(yc-ya);
  25. if(o!=0){
  26. t=o1/o;
  27. s=o2/o;
  28. }
  29. if((t>=0&&s>=0)&&(t<=1&&s<=1))min=0;//Проверим пересекаются ли отрезки.
  30. else{
  31. //Найдём наименьшую высоту опущенную из конца одного отрезка на другой.
  32. dl1=ras(xa,ya,xb,yb,xc,yc);
  33. min=dl1;
  34. dl2=ras(xa,ya,xb,yb,xd,yd);
  35. if((dl2<min&&dl2!=-1)||min==-1)min=dl2;
  36. dl3=ras(xc,yc,xd,yd,xa,ya);
  37. if((dl3<min&&dl3!=-1)||min==-1)min=dl3;
  38. dl4=ras(xc,yc,xd,yd,xb,yb);
  39. if((dl4<min&&dl4!=-1)||min==-1)min=dl4;
  40. if(min==-1){
  41. //В случае, если невозможно опустить высоту найдём минимальное расстояние между точками.
  42. dl1=sqrt((xa-xc)*(xa-xc)+(ya-yc)*(ya-yc));
  43. min=dl1;
  44. dl2=sqrt((xb-xd)*(xb-xd)+(yb-yd)*(yb-yd));
  45. if(dl2<min)min=dl2;
  46. dl3=sqrt((xb-xc)*(xb-xc)+(yb-yc)*(yb-yc));
  47. if(dl3<min)min=dl3;
  48. dl4=sqrt((xa-xd)*(xa-xd)+(ya-yd)*(ya-yd));
  49. if(dl4<min)min=dl4;
  50. }
  51. }
  52. cout<<min;
  53. return 0;
  54. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
0.5 0.5 0