如何找到距离线段指定距离的标题上的第一个点?

时间:2010-02-02 01:22:16

标签: line distance vector segment heading

给定一个起点,一个航向,一个距离和一个线段,找到该标题上距离该线段指定距离的第一个点。

我报道了两个案例,但我无法覆盖最后一个案例。

第一种情况:远离线路。即使起点在指定距离内,也要忽略它。

第二种情况:它与线相交。我用trig和三角形解决了它。最初没有考虑下一个案例。

第三种情况:它朝向线,但它不与它相交。我认为如果正确完成,这也将解决第二种情况。

三个子句:

  1. 最小行距离大于指定距离。忽略它。

  2. 最小行距离等于指定距离。已经找到了分数。

  3. 最小线距小于指定距离。这意味着从航向沿到线段的端点存在垂直线,该直线小于所需的距离。这也意味着在该垂直线的两侧将是所需距离的两条线。一个垂直于航向,而另一个最接近相同的端点而不垂直于航向。只需找到这些点,看看哪一点更接近起点。

  4. 这就是我今天被困的地方。提起它很容易,但是做矢量计算或其他任何结果都很棘手。

    可以将其改为:

    P(t) = P0 + t*v距离线段D L((x1,y1), (x2,y2))的距离是什么时间?{/ p>

    v=(sin(heading), -cos(heading))就我而言。

4 个答案:

答案 0 :(得分:0)

谢谢,这很有效。 我用这种方式找到了alpha:

heading = 45.0*pi/180. #heading 45 degrees.
if x1 > x2: #line segment (x1,y1)<->(x2,y2)
    dx = x2 - x1
    dy = y2 - y1
else:
    dx = x1 - x2
    dy = y1 - y2

segmentHeading = atan2(dx, dy)

if heading > 0:
    alpha = segmentHeading + heading
else:
    alpha = -segmentHeading + heading

t = abs( (dStart - D) / -cos(alpha) ) #-cos in python, sin in C.

答案 1 :(得分:0)

拍摄你的解决方案并不总是有效。我找到了一个反例:

线段=(0,0) - &gt; (0,14)

起点=(19,6)@标题-159.5或200.5西/逆时针

它将与(2.952,0.0)处的线相交,所以我问,它距离0.0的距离是什么。

我得到的结果不正确。

http://img5.imageshack.us/i/failuref.png/

如何判断哪些方法可以使用您的解决方案以及哪些方法不起作用取决于点与线段之间的最小起始距离是否会产生垂直线。

如果我可以在下一篇文章中发布另一张图片,我会提出成功的例子。

我本来想为Sage发布一些产生这些图像的代码,但不幸的是代码标签正在接受python。

答案 2 :(得分:0)

一个成功的结果,其中点和线段之间的最小起始距离垂直于线段:

http://img46.imageshack.us/i/success.png/

答案 3 :(得分:0)

我最终提出的解决方案。

  1. 光线是否与线段相交并且指定距离D远离线段。只需绘制一个矩形并检查与线段平行的边。

  2. 光线是否与线段的每个终点处的半径为D的圆相交。

  3. 最小化总单位时间,以找到远离线段的光线D的第一个点。

  4. 可能的边界情况:D中的起点是否远离线?由用户决定如何处理这种情况。