距离计算
时间限制: 1 Sec 内存限制: 128 MB题目描述
给定一个线段,两端点分别是(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
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
分析:
本题是一道数学问题,考察对三角形的一些概念,比如说怎样判断三角形的某一个顶点作高,这个高是在三角形内还是在三角形外。就拿本题来说,我们知道一个固定点到一条线段的最短距离是它到这条线段的垂线,但是如果线段的区域上方没有包含这个点呢,那么我们就要考虑到该最短距离肯定是距离它最近的那个端点,最长的距离我们都知道,肯定是该点到线段的两个端点的距离最长的那条线段。
三角形面积公式:S=1/2*fabs((x1*y0+x0*y2+x2*y1-x1*y2-x0*y1-x2*y0));
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double x0,y0,x1,y1,x2,y2;
double minn,maxn;
while(~scanf("%lf %lf %lf %lf %lf %lf",&x0,&y0,&x1,&y1,&x2,&y2))
{
double s1,s2,s3,S;
s1=sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));///将三个点之间的距离都求出来
s2=sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2));
s3=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
/**利用余弦定理判断边s1和边s2所组成的角是不是钝角,如果是钝角,则说明
点(x0,y0)到对边的垂线不在该三角形内,那么就选最短边**/
if(s1*s1+s3*s3-s2*s2<0)
{
minn=s1;
maxn=s2;
}
else if(s2*s2+s3*s3-s1*s1<0)///同理
{
minn=s2;
maxn=s1;
}
else///如果边s1与s2或s2与s3组成的角是锐角或是直角的时候,高肯定在三角形内部
{
S=fabs((x1*y0+x0*y2+x2*y1-x1*y2-x0*y1-x2*y0));///求出三角形的面积,这里没乘二分之一
minn=S/s3;///最短距离就是高啦
maxn=max(s2,s1);///最大距离就从两边中选啦
}
printf("%.2lf %.2lf\n",minn,maxn);
}
return 0;
}