计算几何——点到线的距离的实现

原理:
计算几何——点到线的距离的实现_第1张图片
利用向量点乘求出P到L上的投影长度PP0,再利用勾股定理求d的程度即可。

#include 
#include 
using namespace std;

struct Point
{
     
    double x;    // x坐标
    double y;    // y坐标
    double z;    // z坐标(默认为0,如果需要三维点则给z赋值)

    Point(double a = 0, double b = 0, double c = 0) {
      x = a; y = b; z = c; } // 构造函数
};
struct Line
{
     
    Point s;    // 起点
    Point e;    // 终点
    bool is_seg; // 是否是线段

    Line() {
     };    // 默认构造函数
    Line(Point a, Point b, bool _is_seg = true) {
      s = a; e = b; is_seg = _is_seg; }    // 构造函数(默认是线段)
};
double length(const Point& vec)//向量长度
{
     
    return (sqrt(pow(vec.x, 2) + pow(vec.y, 2) + pow(vec.z, 2)));
}
Point sub(const Point& lhs, const Point& rhs)//向量相减
{
     
    Point res;

    res.x = lhs.x - rhs.x;
    res.y = lhs.y - rhs.y;
    res.z = lhs.z - rhs.z;

    return res;
}
double dotMultiply(const Point& vec1, const Point& vec2)//向量点乘
{
     
    return(vec1.x * vec2.x + vec1.y * vec2.y + vec1.z * vec2.z);
}
double ptolDistance(const Point& p, const Line& l)
{
     
    Point line_vec = sub(l.e,l.s);//直线向量
    Point point_vec = sub(p, l.s);//点到直线端点的向量
	
    // 首先计算点在线段投影长度
    double project_len = dotMultiply(line_vec, point_vec) / length(line_vec);

    // 根据勾股定理计算点的距离
    double distance = sqrt(pow(length(point_vec), 2) - pow(project_len, 2));

    return distance;
}
int main()
{
     
	//测试数据
	Point p(1.0,2.0);
	Point e(0.0,0.0),s(1.0,0.0);
	Line l(e,s,true);
	cout<<ptolDistance(p,l);
}

你可能感兴趣的:(计算几何)