优雅的折线“左移”测试

2024-05-06

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(使用前将#替换为@)

优雅的折线“左移”测试 的相关文章

  • 找到不(必要)与二进制矩阵中的图像边界对齐的最大矩形

    我在用这个解决方案 https stackoverflow com questions 2478447 find largest rectangle containing only zeros in an nn binary matrix在
  • 如何返回 Solidity 中的结构数组?

    我正在为以太坊智能合约设计一个解决方案bidding 用例包括保留名称 例如 myName 并分配给一个地址 然后 人们可以竞标该名称 在本例中为 myName 可以有多个名称发生多次此类出价 struct Bid address bidO
  • 将整数列表划分为总和相等的 K 个子列表

    类似的问题还有1 https stackoverflow com questions 27322804 partition of a set into k disjoint subsets with equal sum and 2 http
  • 用于基本要素匹配的最坏情况 NlogN 算法

    查找两个相同大小数组的元素之间的唯一映射 https stackoverflow com questions 4411940 find the unique mapping between elements of two same size
  • StackOverflowError 计算 BigInteger 的阶乘?

    我正在尝试编写一个Java程序来计算大数的阶乘 它似乎BigInteger无法容纳这么大的数量 下面是我编写的 简单的 代码 public static BigInteger getFactorial BigInteger num if n
  • 加速球之间的碰撞检测

    我正在编写一个物理引擎 模拟器 其中包含 3D 太空飞行 行星 恒星引力 船舶推力和相对论效应 到目前为止 一切进展顺利 但是 我需要帮助的一件事是碰撞检测算法的数学 我使用的运动迭代模拟基本上如下 注意 3D 矢量全部大写 For eac
  • 数组中最远的相等元素

    假设你有一个未排序的数组 你如何找到两个相等的元素 使它们成为数组中最远的元素 例如8 7 3 4 7 5 3 9 3 7 9 0ans 将是7 9 7 1 8 我想到了以下几点 initialise max 0 using hashing
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • 计算具有 3 个循环的算法的复杂度

    我尝试解决以下练习 以下代码片段最坏情况运行时间的增长顺序是什么 作为 N 的函数 int sum 0 for int i 1 i lt N i for int j 1 j lt i i j for int k 1 k lt j j k s
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • Excel - 确定排列的奇偶性

    我正在处理一个 Excel 工作表 需要确定大小数字的垂直数组的奇偶校验N 该数组包含来自的每个数字1 to N每一次正好一次 在这种情况下 奇偶校验被定义为将加扰数组转换为从小到大排序的数组所需的交换次数 例如 数组 3 1 2 4 具有
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • 有效地合并两个数组 - 一个已排序,另一个未排序

    我正在解决一个问题 该问题有一个由 n 个元素组成的排序数组 后跟一个未排序的长度数组 O logn O 平方 n 如何最有效地对整个列表进行排序 在上述两种情况下我应该使用哪种排序 由于将单个元素插入数组并保持其排序是O n 你不可能变得
  • 素数生成器算法

    我一直在尝试解决素数生成算法的SPOJ问题 这是问题 彼得想为他的密码系统生成一些素数 帮助 他 你的任务是生成两个给定之间的所有素数 数字 Input 输入以单行中测试用例的数量 t 开始 t Output 对于每个测试用例 打印所有素数
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 计算三次贝塞尔曲线的弧长、曲线长度。为什么不工作?

    我正在用这个算法计算弧长 三次贝塞尔曲线的长度 function getArcLength path var STEPS 1000 gt precision var t 1 STEPS var aX 0 var aY 0 var bX 0

随机推荐