题目描述
给定一个线段,两端点分别是(x1,y1),(x2,y2),求某点至该线段的最短和最长距离,该点的坐标是(x0,y0), 保证线段上的两端点不互相重合。
输入
依次给出x0,y0,x1,y1,x2,y2的坐标,依照题目描述求出最短和最长距离
输出
输出保留两位小数
样例输入
1.0 2.0 1.0 2.0 3.0 2.0
1.0 2.0 3.0 0.0 5.0 0.0
1.0 2.0 0.0 0.0 3.0 0.0
样例输出
0.00 2.00
2.83 4.47
2.00 2.83
我们可以用叉乘来求其面积,然后用面积除以线段的长,则可得到其高,即最短距离;
此时应该要考虑一种情况,高是在三角形之外还是在其之内。如果在其之外,则应该直接算该点到线段两端点的最小距离,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double max(double a,double b)
{
return a>b?a:b;
}
double min(double a,double b)
{
return a<b?a:b;
}
int main()
{
double x1,y1,x2,y2,x3,y3,A,B,C,d1,d2,d3,S;
while(~scanf("%lf %lf %lf %lf %lf %lf",&x3,&y3,&x1,&y1,&x2,&y2))
{
S=fabs((x1-x3)*(y1-y2)-(x1-x2)*(y1-y3));
d1=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
d2=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
d3=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
if(d1*d1+d3*d3-d2*d2<0) printf("%.2lf %.2lf\n",min(d2,d3),max(d2,d3));
else if(d2*d2+d1*d1-d3*d3<0) printf("%.2lf %.2lf\n",min(d2,d3),max(d2,d3));
else printf("%.2lf %.2lf\n",S/d1,max(d2,d3));
}
return 0;
}