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

原理:
在这里插入图片描述
利用向量点乘求出P到L上的投影长度PP0,再利用勾股定理求d的程度即可。

#include <iostream>
#include <math.h>
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);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值