1

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

我涵盖了两个案例,但我无法涵盖最后一个案例。

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

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

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

三个子案例:

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

  2. 最小线距离等于指定距离。已经找到要点了。

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

这就是我今天卡住的地方。绘制它很容易,但是进行矢量计算或任何结果都很棘手。

可以将其改写为:

什么时候离线段P(t) = P0 + t*v有一段距离?DL((x1,y1), (x2,y2))

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

4

4 回答 4

0

A successful result where the minimum starting distance between the point and the line segment is perpendicular to the line segment:

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

于 2010-02-05T20:35:09.777 回答
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.
于 2010-02-02T20:57:44.363 回答
0

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

线段 = (0,0) -> (0,14)

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

它将与 (2.952, 0.0) 处的线相交,所以我问,它在 0.0 的距离内在哪里。

我得到的结果是不正确的。

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

我如何判断哪些可以使用您的解决方案,哪些不能工作取决于点和线段之间的最小起始距离是否创建垂直线。

如果我可以在下一篇文章中再发一张图片,我会放上成功的例子。

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

于 2010-02-05T20:29:47.620 回答
0

嗨,我最终想出了解决方案。

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

  2. 射线是否在线段的每个端点与半径为 D 的圆相交。

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

可能的边界情况:起点是否在 D 范围内并且远离线?如何处理这种情况取决于用户。

于 2010-02-15T21:20:11.560 回答