三维空间点到直线的距离C++实现

mark一下向量点积以及向量叉积的知识点~~

向量的点乘

点乘是两个向量相应元素的乘积的和,即:
V1( x1, y1, z1)·V2(x2, y2, z2) = x1*x2 + y1*y2 + z1*z2;
点乘的结果不是一个向量,而是一个标量(Scalar)。
A·B = |A||B|Cos(θ)
θ是向量A和向量B见夹角。这里|A|我们称为向量A的模(norm)。
Cos(θ) = A·B /(|A|*|B|)

向量的叉乘

对于向量u和v, u x v的结果是一个既垂直于u又垂直于v的向量,假设记作n.
n = u x v;
而n的方向,是由右手法则决定的。 即伸出右手,四个手指方向从u绕到v. 此时,大姆指的方向,就是n的方向。 我们通常叫做右向量。

点到直线的距离

假设给出空间中的三个点:A,B,C,求点C到由点A、B构成的直线的距离。
d = (AB x AC)/|AB|
|AB X AC|/2是三角形ABC的面积,这个三角形的底是|AB|,高就是C到AB的距离。

po代码(C++),计算点到直线的距离:

struct S_Point
{
	double x;
	double y;
	double z;
};

double DistanceOfPointToLine(S_Point* a, S_Point* b, S_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; 
}

参考:

http://www.cnblogs.com/live41/archive/2009/12/30/1635786.html


  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
三维空间中,点到直线距离可以通过向量运算来求解。假设有一个点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的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值