切磋:关于点到线段的距离问题?
<p>已知线段两点坐标和线段外一点坐标,求取点到线的距离?</p><p>我已经实现了,只是觉得效率比较低,望高人指点一下</p><p>我的思路是:1.先搞一个函数判断点和线段有没有垂直(这个有点复杂,也许是我自己搞得的复杂了),根据直线方程(Y=KX+B)的性质:相互垂直的直线其K值互为负倒 数,然后求取所有与已知线段垂直直线的偏移范围(与B值有关),最后确定通过线段外点的直线是否在此范围内,进而判断垂直与否</p><p> 2.如果不垂直,则分别计算点到线段两个端点的距离,然后比较大小</p><p> 3.如果垂直,则根据通过已知点并平行于线段的直线方程的偏移距离测算点到线段的距离!</p><p>自己都晕了 呵呵 ,如果有人对此感兴趣,我可以把代码贴出来</p><p>最重要的是请高人指点简便方法</p> <p>不知道你的点到线段的距离是怎么定义的,是不是线段上的和该点最近的点的距离?还仅仅是垂直距离?</p> chenyaqiou发表于2007-10-30 8:41:00static/image/common/back.gif不知道你的点到线段的距离是怎么定义的,是不是线段上的和该点最近的点的距离?还仅仅是垂直距离?<p>在我看来点到线段的距离和点到直线的距离是不一样的</p><p>我的定义就是“如果点到线段有垂直的话就是垂直距离,没有垂直就是点到线段端点最近点的距离”,所以要进行判断有没有垂直(也是关键,我这么认为)</p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><p><font face="Times New Roman"> </font></p></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;">点<font face="Times New Roman">p0</font>到直线<font face="Times New Roman">(pt1,pt2)</font>的距离<font face="Times New Roman">?</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;">这个问题用解析代数法比较简单<font face="Times New Roman">.</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman">1. </font>设直线<font face="Times New Roman">
(</font>应该说线段<font face="Times New Roman">)</font>的长为<font face="Times New Roman">L</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman"><span style="mso-spacerun: yes;"> L=sqr( (pt2(0)-pt1(0))^2 + (pt2(1)-pt1(1))^2 + (pt2(2)-pt1(2))^2 ) </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman">2. </font>直线<font face="Times New Roman">(pt1,pt2)</font>的单位矢量为</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman"><span style="mso-spacerun: yes;"> v= (pt2 - pt1) / L , [ v(i) = (pt2(i) - pt1(i)) / L , (i=0,1,2) ]</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;">这里就产生一个限制条件<font face="Times New Roman">, </font>也是解这个问题的唯一的限制条件<font face="Times New Roman">,</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;">即<font face="Times New Roman"> L</font>不能等于<font face="Times New Roman">0<span style="mso-spacerun: yes;"> (L>0)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman">3. </font>过点<font face="Times New Roman">p0</font>与直线的任意一端点<font face="Times New Roman">(</font>可假定为<font face="Times New Roman">pt1),</font>可以做一矢量<font face="Times New Roman">n</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman"><span style="mso-spacerun: yes;"> n = p0 - pt1 , [ n(i) = p0(i) - pt1(i), (i=0,1,2) ]</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><span style="mso-spacerun: yes;"><font face="Times New Roman"> </font></span>矢量<font face="Times New Roman">n</font>的长度<font face="Times New Roman">Ln= sqr( n(0)^2 + n(1)^2 + n(2)^2 )</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman">4. p0</font>到直线的垂足设为<font face="Times New Roman">p, p0</font>到<font face="Times New Roman">p</font>的长度<font face="Times New Roman">d </font>为所要求的结果<font face="Times New Roman">.</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;">如上图<font face="Times New Roman">, p</font>到<font face="Times New Roman">pt1</font>的长度<font face="Times New Roman">t</font>可由矢量的内积运算求出</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman"><span style="mso-spacerun: yes;"> t=n</font></span>·<font face="Times New Roman">v</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman"><span style="mso-spacerun: yes;"> t=n(0)*v(0)+ n(1)*v(1)+ n(2)*v(2)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;">由勾股定理<font face="Times New Roman">, </font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman">d=sqr(t^2 + Ln^2)</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman">5. </font>结论</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><span style="mso-spacerun: yes;"><font face="Times New Roman"> </font></span>只要直线长度不为<font face="Times New Roman">0, </font>就可以用上述方法求出点到直线的距离</p>
页:
[1]