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...