matlab練習程序(異面直線最近點和距離)


計算方法:

1. 兩條直線方向向量v1和v2的叉積,得到平行於兩條直線的平面v3。

2. 計算v3與第一條直線v1叉積,得到垂直於v3並且過線v1的平面v4,計算面v4與線v2的交點,得到線v2上的點t2。

3. 計算v3與第二條直線v2叉積,得到垂直於v3並且過線v2的平面v5,計算面v5與線v1的交點,得到線v1上的點t1。

4. t1與t2即為異面直線最近點,t1與t2距離即為異面直線距離。

matlab代碼如下:

clear all;close all;clc;

p1 = rand(3,1)*2-1;     %隨機生成一條直線
v1 = rand(3,1)*2-1;

p2 = rand(3,1)*2-1;     %隨機生成另一條直線
v2 = rand(3,1)*2-1;

v1 = v1/norm(v1);
v2 = v2/norm(v2);

t = -1:0.01:1;
X1 = v1.* repmat(t,3,1) + p1;
X2 = v2.* repmat(t,3,1) + p2;

v3 = cross(v1,v2);      %計算和兩條直線都平行的平面
v3 = v3/norm(v3);

[planx,plany] = meshgrid(min([X1(1,:) X2(1,:)]):0.02:max([X1(1,:) X2(1,:)]),min([X1(2,:) X2(2,:)]):0.01:max([X1(2,:) X2(2,:)]));    %生成平行平面
planz1 =  p1(3) -(v3(1)*(planx-p1(1))+v3(2)*(plany-p1(2))) / v3(3);
planz2 =  p2(3) -(v3(1)*(planx-p2(1))+v3(2)*(plany-p2(2))) / v3(3);

t1 = (cross(v3,v2)'*(p2-p1))/(cross(v3,v2)'*v1)*v1 + p1;    %計算過一條直線和v3面垂直的面,計算得到另一條直線和該面的交點。
t2 = (cross(v3,v1)'*(p1-p2))/(cross(v3,v1)'*v2)*v2 + p2;    %和上一步類似

mesh(planx,plany,planz1);           %畫出平行平面
hold on;
mesh(planx,plany,planz2);
plot3(X1(1,:),X1(2,:),X1(3,:),'b'); %畫出兩條直線
plot3(X2(1,:),X2(2,:),X2(3,:),'r');
plot3(t1(1),t1(2),t1(3),'b*');      %畫出最近點
plot3(t2(1),t2(2),t2(3),'r*');
plot3([t1(1) t2(1)],[t1(2) t2(2)],[t1(3) t2(3)],'g');   %畫出最短線段
grid on;
axis equal;

結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM