给出点A、B的坐标, 构成线段AB, 再给出一点P的坐标, 求点P到线段AB的最短距离
#include<cmath>
#include<iostream>
using namespace std;
typedef struct node
{
double x, y;
}*PNODE,NODE;
double getDis2(NODE a, NODE b) //得到两点距离的平方
{
return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y);
}
double disMin(NODE A, NODE B,NODE P)
{
double r = ((P.x - A.x)*(B.x - A.x) + (P.y - A.y)*(B.y - A.y)) / getDis2(A,B);
if (r <= 0) return sqrt(getDis2(A,P)); //第一种情况, 返回AP的长
else if (r >= 1) return sqrt(getDis2(B,P)); //第二种情况, 返回BP的长度
else //第三种情况, 返回PC的长度
{
double AC = r*sqrt(getDis2(A,B)); //先求AC的长度,(AC=r*|AB|)
return sqrt(getDis2(A,P)-AC*AC); //再勾股定理返回PC的长度
}
}
int main()
{
NODE A, B, P;
cin >> A.x >> A.y;
cin >> B.x >> B.y;
cin >> P.x >> P.y;
cout << disMin(A, B, P) << endl;
return 0;
}
向量的正交投影
如图给定两个向量x,y,那么向量x在y上的投影为z。
通过学习我们知道,
点积:
于是可以推导得
另外我们知道方向向量的,如果u表示向量y的方向向量, , 那么向量x在向量y上面的投影可以由下式计算:
我们还注意到,向量x在向量y上的投影得到的向量z,它的方向向量和向量y的方向向量是一致的,所以向量z可表示为 .
所以 : (与图片中手写等式成立)
知道了向量x在向量y上面的投影z后,我们就能够计算向量x-z的距离: