在Python中,如何找到两个圆共有的所有整数点?
例如,想象一个维恩图的两个(大小相等)圆的交点,中心点(x1,y1)
和(x2,y2)
以及半径r1=r2
。此外,我们已经知道圈子的两个交点是(xi1,yi1)
和(xi2,yi2)
。
如何以有效的方式生成两个圆圈中包含的所有点(x,y)
的列表?也就是说,绘制一个包含交叉点的框并迭代它,检查给定点是否在两个圆圈内,但有更好的方法会很简单吗?
答案 0 :(得分:1)
请记住,此处有四种情况。
答案 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为整数的点非常重要。相反,像素是网格线之间的小方块。这样可以防止出现边缘问题。