Given:
- (X,Y)坐标,即车辆的位置。
- (X,Y) 数组,它们是折线中的顶点。请注意,折线仅由直线段组成,没有圆弧。
我想要的是:
- 计算车辆是在折线的左侧还是右侧(当然还是在顶部)。
我的做法:
- 迭代所有线段,并计算到每个线段的距离。然后,对于最近的段,您进行一个简单的左侧测试(如所解释的here https://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-of-a-line例如)。
可能的问题:
- 当三个点形成的角度小于 90 度时(如下图所示),就会出现更复杂的情况。当车辆位于如下所示的红色路段时,最近的路段可以是两者之一。但是,那left-of测试将产生right如果第一段被选为最近的段,并且left否则。我们可以很容易地看出(至少我希望如此),正确的结果应该是车辆是left的折线。
我的问题:
- 我怎么能够优雅地,但大多数情况下有效率的处理这个具体情况吗?
到目前为止我的修复:
- 从顶点开始,为两个线段计算该线段上的一个点。
- 使用欧几里德距离计算从车辆到两个点的距离
- 保留计算点最接近的线段。
我对这个修复不是很满意,因为我觉得我缺少一个更优雅的解决方案,我的修复感觉相当“hacky”。不过,效率是关键,因为它是在实时嵌入式系统上使用的。
现有的代码库是 C++ 的,所以如果你想用特定的语言编写,我更喜欢 C++。
谢谢!
[edit]我变了my fix,从垂直点到平行点,因为我认为跟随线段比计算向外法线更容易。
这个话题已经不活跃太久了,我相信它已经死了。不过我有一个解决方案。
但是,那left-of测试将产生right如果第一段是
选择为最近的线段,并且left否则。
你使用了稍微含糊的语言。我要用segments谈论折线中的线段和象限谈论它们划定的区域。所以在你的情况下,你会有一个红色quadrant这似乎在一个的右边segment和在另一个的左边。
如果左侧测试对不同的段产生不同的答案,您应该对段本身重新进行测试。在你的情况下,你会:
两个部分对于象限所在的位置存在分歧,因此您需要进行两个进一步的消歧测试:
这使我们得出结论,第二段是之间第一段和象限——因为这两个部分都位于第二段的不同一侧。因此,第二段比第一段“更接近”象限,并且它对左右测试的答案应被用作正确的答案。
(我几乎确定您只能使用两个消歧测试之一,为了清楚起见,我将两者都放入了)
为了完整起见:我相信这个解决方案也满足了您对效率和优雅的需求,因为它使用了您从一开始就使用的相同方法(左侧测试),因此它满足指定的所有条件:它优雅、高效并且能够解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)