【问题标题】:Algorithm to find the closest 3 points that when triangulated cover another point找到在三角化时覆盖另一个点的最近 3 个点的算法
【发布时间】:2010-11-19 21:18:46
【问题描述】:

想象一个画布,周围有一堆随机分布的点。现在选择其中一个点。您如何找到最接近它的 3 个点,这样如果您绘制一个连接这些点的三角形,它将覆盖所选点?

澄清:“最近”是指到该点的最小距离总和。


这主要是出于好奇。我认为如果一个点是未知的,但它周围的点是已知的,这将是估计它的“价值”的好方法。使用 3 个周围点,您可以推断该值。我以前没有听说过这样的问题,看起来不是很微不足道,所以我认为这可能是一个有趣的练习,即使它不是估计某事的最佳方法。

【问题讨论】:

  • 您想如何定义“最近的 3 个点”?最小平均距离?面积最小的三角形?
  • 您的问题含糊不清。你想最小化三角形的表面吗?三个距离的乘积?
  • 我认为您需要更准确地定义“最接近”。面积最小的三角形?到该点的最小距离总和?最近的点必须包含在三角形中?
  • 已澄清。我猜两者都可以……但我不想要长/长三角形。我认为最小距离会更好地避免这种情况。

标签: algorithm geometry


【解决方案1】:

您的问题描述不明确。图中你要找哪个三角形,红色的还是蓝色的?

蓝色三角形根据点的距离的字典比较更接近,而红色三角形根据点的距离之和更接近。

编辑:您澄清它以明确表示您希望最小化距离总和(红色三角形)。

那么,这个草图算法怎么样?

  1. 假设所选点位于原点(便于描述算法)。
  2. 按与原点的距离对点进行排序:P(1) 最接近,P(n) 最远。
  3. i = 3,s = ∞ 开始。
  4. 对于每个三元组的点 P(a)、P(b)、P(i) 和 a em> b i,如果三角形包含原点,令s = min(s, | P(a)| + |P(b)| + |P(i)|)。
  5. 如果 s ≤ |P(1)| + |P(2)| + |P(i)|,停止。
  6. 如果 i = n,停止。
  7. 否则,增加 i 并返回第 4 步。

显然这是最坏情况下的 O(n³)。

这是另一种算法的草图。考虑所有点对 (A, B)。要使第三个点构成一个包含原点的三角形,它必须位于该图中的灰色阴影区域:

通过在极坐标(r, θ)中表示点并根据 θ 对它们进行排序,可以直接检查所有这些点并选择最接近原点的点。

在最坏的情况下,这也是 O(n³),但是在许多问题实例中,访问对 (A, B) 的合理顺序应该会导致提前退出。

【讨论】:

  • 澄清:“最近”是指到该点的最小距离总和。参见 Q 上的编辑。
  • BTW“三角形包含原点”的意思是“点间角的和加起来 Pi”
【解决方案2】:

只是对迭代方法的警告。您可能会发现一个具有 3 个“近点”的三角形,其“长度”大于另一个,结果是在集合中添加了一个更远的点。抱歉,不能将此作为评论发布。

见图表。

红色三角形的周长接近 4 R,而黑色三角形的周长为 3 Sqrt[3] -> 5.2 R

【讨论】:

  • 是的,这就是为什么在你找到一个三角形之后,你需要继续搜索,直到你可以证明你找到的三角形是最小的。请参阅我的答案中的第 5 步。
  • @Gareth 是的。我猜并不是所有的答案都能解决这个问题。
【解决方案3】:
  1. 就像@thejh 建议的那样,按与所选点的距离对点进行排序。
  2. 从前 3 个点开始,寻找覆盖所选点的三角形。
  3. 如果未找到三角形,请扩大范围以包含下一个最近点,然后尝试所有组合。
  4. 一旦找到一个三角形,您不一定有最终答案。但是,您现在已经限制了要检查的最后一组点。要检查的最远点的距离等于找到的第一个三角形的距离之和。比这更远,距离总和肯定会超过找到的第一个三角形。
  5. 增加点的范围以包括距离
  6. 现在检查所有组合,答案是从该集合中找到距离总和最小的三角形。

【讨论】:

  • 这听起来应该可以 :) 听起来有点像 A* 之类的。
【解决方案4】:

第二枪

子解:(解析几何基础,熟悉的可以跳过)求对面半平面的点

示例:让我们有两点:A=[a,b]=[2,3] 和 B=[c,d]=[4,1 ]。求向量 u = A-B = (2-4,3-1) = (-2,2)。这个向量平行于 AB 线,向量 (-1,1) 也是如此。这条线的方程由矢量 uAB 中的点定义(即 A):

X = 2 -1*t
Y = 3 +1*t

其中 t 是任何实数。摆脱t

t = 2 - X
Y = 3 + t = 3 + (2 - X) = 5 - X
X + Y - 5 = 0

任何符合这个等式的点都在直线上。

现在让我们用另一个点来定义半平面,即C=[1,1],我们得到:

X + Y - 5 = 1 + 1 - 5 < 0

任何具有相反非等式符号的点都在另一个半平面中,即这些点:

X + Y - 5 > 0

解决方案:找到适合点S

的最小三角形
  1. 找到最近的点 P 为 min(sqrt( (Xp - Xs)^2 + (Yp) > - )^2 ))
  2. 找到与 SP 垂直的矢量 u = (-Yp+Ys,Xp-Xs)
  3. 从相对的半平面到 sigma = pP 找到两个最近的点 AB,其中 p = Su(见子解决方案),如Aq行的不同位点= SP(见子解决方案的最后部分)
  4. 现在我们有了覆盖 S 的三角形 ABP:计算距离总和 |SP|+|SA |+|SB|
  5. 找到第二个离S最近的点,从1继续。如果距离总和小于前面步骤中的距离,记住它。如果 |SP| 大于最小距离总和或没有更多可用点,则停止。

我希望这张图能说明问题。

【讨论】:

  • 这似乎是 O(n),应该足够快,可以计算很多点。
  • 恐怕我不清楚您在第 3 步中定义了什么样的“子平面”。您的意思是“半平面”吗?如果是这样,哪条线界定了这个半平面?您的符号也有点奇怪:当您说“p = Su”时,您在这里指的是哪种向量乘法(点积还是叉积?)还是“p = S + u”?或许一张图就清楚了。
  • @Gareth:确实,子平面是半平面(请原谅我的英语)。我的意思是 p = Su (线 p 由点 S 和向量 u 定义)。已添加图表,如有错误或不清楚,请指正。
  • 感谢图表。现在很清楚了。但是为什么 A 和 B 必须在相反的半平面上呢?为什么其中一个不能在半平面 sigma 中?
  • @Gareth:好点子。我认为,“相反的半平面”条件不会“错过”一些解决方案。在上图中,如果 A 点在 sigma 中,我们将不会在第一步中找到解决方案,但稍后,当 A 或 B 成为初始点时。但我不知道证明/反例,你能帮忙吗?
【解决方案5】:

取最近的 N=3 个点。检查三角形是否适合。如果不是,则将 N 加一并尝试所有组合。这样做直到有什么合适或什么都不合适。

【讨论】:

  • 这将找到一个三角形,使得最大点距离最小化。这可能是也可能不是@Mark 所说的“最接近的 3 点”。例如,如果 N=5,您可能会使用点 3、4 和 5 找到一个三角形,然后停止。但如果你走得更远,你可能会发现一个使用点 1、2 和 6 的三角形。如果 1 和 2 非常接近被覆盖的点,那么这可能是所需的答案。
  • 如果没有实际的反例,我怀疑这并不能保证找到距离总和最小的解决方案。
  • 但这是 O(n^2) 步骤 - “三角形是否适合”的问题也不是微不足道的。
  • Mmmm O(n^2) 是当你必须检查前面的点时,在这里你必须检查前面的点的 combinations .. 似乎 O(n^ 3)
【解决方案6】:

这是我的第一张照片:

  1. 将空间分成象限 在 [0,0] 处选择点 坐标
  2. 找到最近的点 从每个象限(所以你有 4 分)
  3. 来自这些的任何三角形 点应该足够小(但不一定是最小的)

【讨论】:

  • true...第一枪未命中 :-)
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多