切线范围适用于框中的所有点对

时间:2015-07-27 11:26:03

标签: algorithm computational-geometry

假设我有一个包含很多积分的盒子。我需要能够计算通过所有可能的点对的所有线的最小和最大角度。我可以在O(n ^ 2)次中通过枚举每个点与其他所有点来完成它。但是有更快的算法吗?

enter image description here

2 个答案:

答案 0 :(得分:3)

考虑到Evgeny Kluev提出的双平面概念,以及我关于找到最左边交点的评论,我将尝试给出一个没有任何双重空间的等效直接解法。

解决方案很简单:按字典顺序按(x,y)对点进行排序。现在按排序顺序在每两个相邻点绘制一条线。可以证明,通过这些线之一实现最小角度。为了获得最大角度,您需要按字典顺序按(x,-y)排序,并且只检查相邻的点对。

让我们通过最小角度的想法来证明。考虑两个点 A B ,它们产生最小可能的角度。在这些点中,我们可以选择 x 坐标差异最小的对。

  1. 假设他们有相同的 y 。如果它们之间没有其他点,则它们相邻。如果它们之间有任何点,那么显然它们中的至少一个在我们的顺序中与 A 相邻,并且它们都产生相同的角度。

  2. 假设在 A B 之间存在一个带有x坐标的点 P ,即 Ax< ; Px< Bx的。如果 P 位于 AB 上,则 AP 具有相同的角度但 x 坐标的差异较小,因此存在矛盾。当 P 不在 AB 上时, AP PB 会给你更少的角度,这也会产生矛盾

  3. 现在我们将点 A B 放在两条相邻的垂直线上。这些线之间没有其他要点。如果 A B 是其垂直线上的唯一点,则 AB 对按排序顺序和QED明显相邻。如果这些线上有很多点,显然最小角度是通过取左边垂直线上的最高点(必须是 A )和右边垂直线上的最低点(必须是)。由于我们按 y x 的点进行排序,因此这两点也相邻。

答案 1 :(得分:2)

对点进行排序(或使用哈希图)以确定是否存在任何水平线。

然后在双平面上解决这个问题。在这里,您只需要找到最左边和最右边的交叉点。使用二进制搜索来查找一对水平坐标,使得所有交叉点都在它们之间。 (您可以通过从这些坐标继续进行二进制搜索来快速找到近似结果。)

然后根据双平面上的切线对线条进行排序。并且对于按此排序顺序的相邻线对,找到最接近那些水平坐标的交点。在最坏的情况下(当原始平面上的某些线几乎是水平的时),这并不能保证良好的复杂性。但在大多数情况下,时间复杂度将通过排序来确定:O(N log N)+ O(binary_search_complexity)。