求空間兩條直線之間的距離

2021-08-03 11:02:34 字數 2369 閱讀 4212

1. 前言

最近老闆讓寫一段空間點匹配的**, 其中涉及到求空間兩直線之間的距離,寫起來滿費勁的, 這裡做乙個記錄。

2. 處理思路

空間兩直線之間的位置關係主要可以分為: 重合, 平行, 相交, 異面。

2.1 異面情形(含相交):

已知空間中兩線段,如果它們無限變粗,判斷是否相交。(主要討論不在同一平面的情況)線段ab 線段cd 

首先將直線方程化為對稱式,得到其方向向量n1=(a1,b1,c1),n2=(a2,b2,c2).

再將兩向量叉乘得到其公垂向量n=(x,y,z),在兩直線上分別選取點a,b(任意),得到向量ab, 

求向量ab在向量n方向的投影即為兩異面直線間的距離了(就是最短距離啦)。

最短距離的求法:d=|向量n*向量ab|/|向量n|(上面是兩向量的數量積,下面是取模)。

設交點為c,d,帶入公垂線n的對稱式中,又因為c,d兩點分別滿足一開始的直線方程,所以得到關於c(或d)的兩個連等方程,分別解出來就好了!

2.2 平行的情況(含重合)

兩平行直線 

l1:(x-x1)/m=(y-y1)/n=(z-z1)/p,l2:(x-x2)/m=(y-y2)/n=(z-z2)/p, 

記 m1(x1,y1,z1),m2(x2,y2,z2),直線方向向量 s =  

則 記向量 m1m2 = =  

故得平行線間的距離 

d = | m1m2×s | / |s| 

=√[(bp-cn)^2+(cm-ap)^2+(an-bm)^2]/√(m^2+n^2+p^2)

3. 相關**

getbisbytwolines.m

%% getdisbytwolines 用於求解兩條直線之間的距離

% @description 利用 pt31 和 pt32 所構成的直線 向 直線1,2 的公垂線做投影

% @param line1 直線1 的法向量 1 x 3

% @param pt31 直線1 上的某個點 1 x 3 或者 1 x 4

% @param line2 直線2 的法向量 1 x 3

% @param pt32 直線2 上的某個點 1 x 3 或者 1 x 4

% @return dis 返回 兩直線之間的中垂線的距離

%function [dis] = getdisbytwolines(line1, pt31, line2, pt32)

assert(size(line1, 1) == 1 && size(line1, 2) == 3, 'check the input for line1');

assert(size(pt31, 1) == 1 && (size(pt31, 2) == 3 || size(pt31, 2) == 4), 'check the input for pt31');

assert(size(line2, 1) == 1 && size(line2, 2) == 3, 'check the input for line2');

assert(size(pt32, 1) == 1 && (size(pt32, 2) == 3 || size(pt32, 2) == 4), 'check the input for pt32');

tmp = pt32 - pt31;

lineab = tmp(1:3);

line = getcovertialline(line1, line2);

if all(line(:) == 0)

% parallel

dis = abs(norm(cross(line1, lineab), 2) / norm(line1, 2));

else

% not parallel        

dis = abs(dot(line, lineab) / norm(line, 2));

endend

getcoverticalline.m

%% getcovertialline 用於求解兩條直線的公垂線的向量部分

% @param line1 直線1 的法向量 1 x 3

% @param line2 直線2 的法向量 1 x 3

% @return line 返回 兩直線之間的中垂線的法向量

%function [line] = getcovertialline(line1, line2)

assert(size(line1, 1) == 1 && size(line1, 2) == 3, 'check the input for line1');

assert(size(line2, 1) == 1 && size(line2, 2) == 3, 'check the input for line2');

line = cross(line1, line2);

end

C 判斷兩條直線距離

一般式的意思就是ax by c 0 role presentation ax by c 0ax by c 0如果有兩個直線a1 x b1 y c1 0a2 x b2 y c2 0 role presentation a1x b1y c1 0a2x b2y c2 0a1x b1y c1 0a2x b2...

求兩條直線(線段)的交點

如圖,如何求得直線 ab 與直線 cd的交點p?以上內容摘自 演算法藝術與資訊學競賽 思路就是利用叉積求得點p分線段dc的比,然後利用高中學習的定比分點座標公式求得分點p的座標。看不懂的可以去複習下 定比分點 的知識。include include include include using nam...

2018 7 31 C 判斷兩條直線距離

title author date createtime categories c 判斷兩條直線距離 lindexi 2018 07 31 14 38 13 0800 2018 05 08 10 32 50 0800 數學 c 幾何 一般式的意思就是 ax by c 0 如果有兩個直線 a 1x b...