标签:直线 异面 练习 t2 t1 v1 v2 v3 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;
结果如下:
标签:直线,异面,练习,t2,t1,v1,v2,v3,matlab 来源: https://www.cnblogs.com/tiandsp/p/14384109.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。