- #include <cstdio>
- #include <cmath>
- struct POINT
- {
- double x,y;
- void Offset(POINT A) //相对A偏移
- {
- x=x+A.x;
- y=y+A.y;
- }
- POINT operator - ( POINT &A )
- {
- POINT X;
- X.x = x-A.x;
- X.y = y-A.y;
- return X;
- }
- };
- double Dist(POINT A, POINT B,bool sqr=1)
- {
- double x = A.x - B.x;
- double y = A.y - B.y;
- if(sqr)
- return sqrt(x*x+y*y);
- else
- return x*x + y*y;
- }
- double Pnt2SegmentDist(POINT A, POINT B, POINT C)
- {
- POINT AB = B - A; //向量AB
- POINT AC = C - A;
- double r = AB.x * AC.x + AB.y * AC.y;//AB与AC的点乘积
- r /= Dist(A,B,0);//AC在AB上的投影比上AB。调用Dist(),不开方
- //若C的投影在AB外
- if(r < 0)
- return Dist(A, C);//调用Dist(),开方
- if(r > 1)
- return Dist(B, C);
- //若C的投影在AB之间
- POINT D = AB;
- D.x *= r;
- D.y *= r;//因为AB是向量,所以可以这样做。得到AC在AB上的投影向量。
- D.Offset(A);//点D的绝对坐标
- return Dist(C, D);
- }
- int main()
- {
- // freopen("a.txt","r",stdin);
- POINT A,B,C;
- while(scanf("%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y)!=EOF)
- {
- printf("%lf/n",Pnt2LineDist(A,B,C));
- }
- return 0;
- }
用点乘求点到线段的距离
最新推荐文章于 2022-12-27 22:46:03 发布