三維空間點到直線的距離C++實現
阿新 • • 發佈:2019-02-17
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