【C\C++】空间中求一点到两点所构成的直线的距离

最近在做叶面重建的工作,构建叶面TIN的算法中会用到3维中点到直线的距离方程,一开始以为像二维一样有公式之类的,后来找了一下没有找到,就写了一个函数,分享一下

double dis_3D(Point a,Point b,Point s){
    double ab=sqrt(pow((a.X-b.X),2.0)+pow((a.Y-b.Y),2.0)+pow((a.Z-b.Z),2.0));
    double as=sqrt(pow((a.X-s.X),2.0)+pow((a.Y-s.Y),2.0)+pow((a.Z-s.Z),2.0));
    double bs=sqrt(pow((s.X-b.X),2.0)+pow((s.Y-b.Y),2.0)+pow((s.Z-b.Z),2.0));

    double cos_A=(pow(as,2.0)+pow(ab,2.0)-pow(bs,2.0))/(2*ab*as);
    double sin_A=sqrt(1-pow(cos_A,2.0));
    return as*sin_A;
}

基本数学原理就是用余弦定理求出夹角,再求正弦值,然后求出高,
即点到线的距离。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在三维空间,点到直线距离可以通过向量运算来解。假设有一个点P和一条直线L,我们可以先出点P到直线L所在平面的垂线L1,然后计算垂线L1的长度,即为点P到直线L的距离。 具体实现可以按照以下步骤进行: 1. 直线L的方向向量d和一点P0,构造直线L的参数方程P=P0+td,其t为实数。 2. 点P在直线L所在平面上的投影点P1。为了得P1,可以使用向量运算,即将向量P-P0投影到向量d上,然后加上P0即可。 3. 垂线L1的长度,即为点P到直线L的距离。可以使用向量运算,即将向量P-P1取模即可。 下面是一个解点到直线距离的C++函数实现: ```cpp #include <iostream> #include <cmath> using namespace std; // 三维点的类定义 class Point3D { public: double x, y, z; Point3D(double a = 0, double b = 0, double c = 0) : x(a), y(b), z(c) {} }; // 三维向量的类定义 class Vector3D { public: double x, y, z; Vector3D(double a = 0, double b = 0, double c = 0) : x(a), y(b), z(c) {} // 向量点乘 double dot(const Vector3D& v) const { return x * v.x + y * v.y + z * v.z; } // 向量叉乘 Vector3D cross(const Vector3D& v) const { return Vector3D(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); } // 向量取模 double norm() const { return sqrt(x * x + y * y + z * z); } // 向量归一化 Vector3D normalize() const { double n = norm(); return Vector3D(x / n, y / n, z / n); } }; // 点到直线距离 double distance(const Point3D& p, const Point3D& p0, const Vector3D& d) { Vector3D v(p.x - p0.x, p.y - p0.y, p.z - p0.z); // 向量P-P0 Vector3D v1 = v - d.normalize() * d.dot(v) / d.norm(); // 向量P1-P0 return v1.norm(); // 垂线长度 } int main() { Point3D p(1, 2, 3); Point3D p0(0, 0, 0); Vector3D d(1, 1, 1); double dist = distance(p, p0, d); cout << "Distance: " << dist << endl; return 0; } ``` 上述代码,Point3D类和Vector3D类分别表示三维点和向量,其Vector3D类包含了向量点乘、叉乘、取模和归一化等常用的向量运算。distance函数用于计算点到直线距离,其p表示点P,p0表示直线L上的一点P0,d表示直线L的方向向量。函数首先出向量P-P0,然后出向量P1-P0,最后出垂线L1的长度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值