首页 > 编程知识 正文

空间向量求距离,空间解析几何两条直线距离

时间:2023-05-05 03:54:16 阅读:175562 作者:171

1 .前言最近,上司让我写了空间点一致的代码。 其中包括求空间两条直线之间的距离,写起来很困难。 在这里做记录。

2 .处理思维空间的两条直线之间的位置关系主要可以分为重合、平行、交叉、异面。

2.1异面情况(包括交点)空间中的两条线已知且它们无限粗时,判断是否相交。 (主要讨论不在同一平面的情况)线段AB线段CD

问题的关键是求出这两条任意直线之间的最短距离,以及该距离上的两条线是否最接近点坐标,并判断该点是否位于线段AB和线段CD上。

首先,将直线方程化为对称式,得到其方向矢量n1=(a1,b1,C1 )、n2=(a2,b2,C2 )。

进而将两个向量相乘并选择其公垂直向量n=(x,y,z )、在两条直线上分别为点a、b )、任意的),得到向量a~b。

求出向量AB向向量n方向的投影时,即为两个异面直线之间的距离。

最短距离的求法:d=|向量N*向量AB|/|向量N|(上面是两向量的数量积,下面是取模)。

假设交点为c、d,带入公垂线n的对称公式中,c、d两点分别满足第一个直线方程,得到关于c (或d )的两个联立方程,分别求解即可。

33558 blog.Sina.com.cn/s/blog _ a 401 a1 ea 0101 ij9z.html

2.2平行时(包括重叠)两条平行直线

l1:(x-x1 )/m=(y-y1 )/n=) z-Z1 )/p,l2: ) x-x2 )/m=) CJDXF )/n=) z-Z2 )/p,

记为m1(x1,y1,z1 ),m2 ) x2,y2,z2 ),直线方向矢量s={m,n,p}

设向量M1M2={x2-x1,y2-y1,z2-z1}={a,b,c}

需要平行线之间的距离

d=| M1M2s |/|s|

=[(BP-cn )2) cm-AP )2) an-BM )2) /(m ^ 2n ^ 2p ^2) ]

http://www.zybang.com/question/7708426051 e596 b 099898 b b1b 5d 8938 d.html

3 .相关代码getBisByTwoLines.m

%% getDisByTwoLines用于确定两条直线之间的距离。 % @description将pt31和pt32构成的直线朝向直线1利用, 投影的垂线% @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 x4 % @ retur 之间返回垂线的距离% function [ dis ]=getdisbytwoline2s (line 1,pt31,line 2,pt32 ) assert (size (line 1,1 )=1size (line ) ) ssert (size (pt31,1 )==1) size ) pt31,2 )==3||size ) pt31,2 )==4)、' check the input for pt31 '; assert (size (line 2,1 )=1size ) line 2,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); ifall(line(3360 )==0) paralleldis=ABS ) norm ) cross ) lineAB,lineAB ),2 )/norm ) line 1,2 ); else % notparalleldis=ABS (dot (lineAB,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 ) line 1,1 )=1size (line 1,2 )=3,' check the input for line1' ); assert (size (line 2,1 )=1size ) line 2,2 )==3,' check the input for line2' ); line=cross(line1,line2); end test.m

%%单元测试function test (test _ getdisbytwolines ) end%%测试两条直线之间的距离关系function Test_getDisByTwoLines ) line1=[ 0,1,0,0 ] pt31=[0 0 0 1]; pt32=[ 1,0,0,1 ]; % % notparellelandnotintersectdis=getdisbytwolines (line 1,pt31,line2,pt32 ); assert(dis==0,' case 1 : something error '; pt32=[1 1 1 1]; dis=getdisbytwolines(line1,pt31,line2,pt32 ); assert(dis==1,' case 1 : something error '; line2=[ 0,1,1 ]; pt32=[1 1 1 1]; dis=getdisbytwolines(line1,pt31,line2,pt32 ); assert(dis==1,' case 1 : something error '; % % parellel line2=[ 0,1,0 ]; pt32=[1 1 1 1]; dis=getdisbytwolines(line1,pt31,line2,pt32 ); assert(dis==sqrt ) 2、' case 2 : something error ' ); % % intersect line2=[ 1,0,1 ]; pt32=[1 1 1 1]; dis=getdisbytwolines(line1,pt31,line2,pt32 ); assert(dis==0,' case 3 : something error '; % % collapse line2=[ 0,1,0 ]; pt32=[0 1 0 1]; dis=getdisbytwolines(line1,pt31,line2,pt32 ); assert(dis==0,' case 4 : something error '; line2=[ 0,1,0 ]; pt32=[0 0 0 1]; dis=getdisbytwolines(line1,pt31,line2,pt32 ); assert(dis==0,' case 4 : something error '; 结束

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。