查找两个圆圈共有的所有点

时间:2010-04-28 15:37:49

标签: python geometry intersection points

在Python中,如何找到两个圆共有的所有整数点?

例如,想象一个维恩图的两个(大小相等)圆的交点,中心点(x1,y1)(x2,y2)以及半径r1=r2。此外,我们已经知道圈子的两个交点是(xi1,yi1)(xi2,yi2)

如何以有效的方式生成两个圆圈中包含的所有点(x,y)的列表?也就是说,绘制一个包含交叉点的框并迭代它,检查给定点是否在两个圆圈内,但有更好的方法会很简单吗?

6 个答案:

答案 0 :(得分:1)

请记住,此处有四种情况。

  1. 两个圆都不相交,意味着“公共区域”为空。
  2. 一个圆圈完全位于另一个圆圈内,意味着“公共区域”是较小/内部圆圈。另请注意,如果它们是相同的同心圆,那么这种退化的情况就是这样的情况。鉴于它们是您指定的等直径圆的标准,情况必须如此。
  3. 两个圆圈在一个交叉点接触。
  4. 将要有两个交叉点的“一般”情况。从那里,您有两个弧定义封闭区域。在这种情况下,盒子绘制方法现在可以工作,我不确定是否有更有效的方法来确定交叉点包含的内容。但请注意,如果您只是对该区域感兴趣,那么a formula就可以了。

答案 1 :(得分:1)

您可能还想了解图形开发中使用的各种裁剪算法。我使用剪切算法解决了很多类似于你在这里问的问题。

答案 2 :(得分:1)

如果您的圈子的位置和半径可能会因粒度小于您的网格而变化,那么无论如何您都会检查一堆点。

您可以通过适当地定义搜索区域来最小化您检查的点数。它的宽度等于交点之间的距离,高度等于

r1 + r2 - D

D是两个中心的分离。请注意,此矩形通常不与X轴和Y轴对齐。 (这也可以测试两个圆是否相交!)

实际上,你只需要检查这些点中的一半。如果半径相同,则只需要检查四分之一。问题的对称性可以帮助你。

答案 3 :(得分:1)

你几乎就在那里。 迭代框中的点应该相当不错,但是如果第二个坐标直接在限制之间迭代,则可以做得更好。

假设您首先沿x轴迭代,然后沿y轴迭代,而不是在边界框之间进行迭代,找出每个圆与x线相交的位置,更具体地说,您对交叉点的y坐标感兴趣,并且在那些之间迭代(注意四舍五入)

执行此操作时,由于您已经知道自己在圈内,因此可以完全跳过检查。 如果你有很多积分,那么你会跳过很多检查,你可能会得到一些改进。

作为一项额外的改进,您可以选择x轴或y轴,以最大限度地减少计算交叉点所需的次数。

答案 4 :(得分:0)

所以你想找到两个圆圈内的格点?

您建议绘制方框并迭代框中所有点的方法对我来说最简单。它可能是有效的,只要框中的点数与交叉点中的点数相当。

即使它没有尽可能高效,在你有充分的理由相信它是一个真正的瓶颈之前,你不应该尝试优化它。

答案 5 :(得分:0)

我认为“所有点”的意思是“所有像素”。假设您的显示器是NX乘NY像素。有两个数组

int x0[NY], x1[NY]; initially full of -1.

两条曲线之间的交叉点是菱形的。 沿每条曲线迭代x,y值。在每个y值(即曲线与y + 0.5交叉处)处,将x值存储在数组中。如果x0 [y]为-1,则将其存储在x0中,否则将其存储在x1中。

同时跟踪y的最低值和最高值。

完成后,只需迭代y值,并在每个y处迭代x0和x1之间的x值,即for (ix = x0[iy]; ix < x1[iy]; ix++)(或反向)。

了解像素不是x和y为整数的点非常重要。相反,像素是网格线之间的小方块。这样可以防止出现边缘问题。