我正在测试计算两个省略号重叠区域的算法的实现。
测试的想法是目视检查椭圆的交点(如果有的话)是否计算正确。如果不是这种情况,那么计算的面积就不能正确。
编辑:我的实现的输出是一个带有交叉点的文件。我绘制了椭圆和交点以及savefig
它们。我在视觉上检查结果并说服自己交叉点是否正确。
这是一个例子:
我的问题只是这种视觉方法不会随着测试数量的增加而扩展(比如说 1000 个案例)。
任何想法如何自动化这个测试?
所以我做了一些研究,这是我推荐的。你可以做的是使用另一个 python 库来计算两个椭圆的交点,然后比较你的实现返回的两个。如果不是,这两者应该是相同的,你可以让测试失败并调查哪一个是错误的。sympy库可以计算多个支持的实体 Ellipse、Circle、Polygon、RegularPolygon、Triangle 之间的交点。我建议使用标准库的unittest来执行实际测试。然后你可以运行一个测试运行,创建几千个随机椭圆并检查每个椭圆的交点。
您可以在他们的文档中查看包含交叉计算的示例代码。他们在他们的文档中有这个惊人的功能,您可以单击示例旁边的在 SymPy Live 中运行代码块链接,它将在您的浏览器中打开一个 python 会话并在他们的谷歌应用引擎服务器上运行该示例。这使您可以将他们的库用于试驾,而无需将其安装在您的机器上。查看他们基于网络的交互式 python shell,它真的很整洁。
方法
由于我采用了全新的方法,因此决定将其发布为另一个答案。我使用了Python 图像库在不同的图像上绘制两个椭圆,颜色为红色和绿色。然后我将两张图像混合在一起,计算了图像中黄色像素的数量,黄色是绿色和红色的合成,将成为交叉区域的颜色。第一个椭圆将被着色为红色,第二个为绿色,它们的交点为黄色。出于演示目的,我将第二个椭圆做成了一个圆圈,并将其完全包含在第一个椭圆中,以便可以显示它的面积应该是那个大小的圆圈的面积。由于像素被计数,因此无法得到准确的答案,但在此示例中,分辨率为 500x500,像素计数区域与正确值相差 0.42%。当然,如果您提高分辨率,您可以获得更高的精度,但出于测试目的,我只接受 +/- 1% 的容差。
表现
我运行了一个调用函数 1000 次的测试运行,它在 13.4 秒内完成。因此,创建三个图像并进行像素计数大约需要 13 毫秒,这对于手头的任务来说性能还不错。
代码
from PIL import Image, ImageDraw
from math import pi
RED, GREEN, YELLOW = (255, 0, 0), (0, 255, 0), (127, 127, 0)
SIZE = (500, 500)
def overlap(ellipse1, ellipse2):
im1 = Image.new("RGB", SIZE)
ImageDraw.Draw(im1).ellipse(ellipse1, fill=RED)
im2 = Image.new("RGB", SIZE)
ImageDraw.Draw(im2).ellipse(ellipse2, fill=GREEN)
im3 = Image.blend(im1, im2, 0.5)
im3.show()
im3.save('test.png', "png")
return [count for count, color in im3.getcolors() if color == YELLOW][0]
area1 = overlap((0, 50, 500, 450), (50, 50, 450, 450))
area2 = pi * (200**2)
print "overlap calc:" , area1
print "exact area: " , area2
print "percent diff:" , ((area1 - area2)/area2)*100
输出
overlap calc: 126196
exact area: 125663.706144
percent diff: 0.423585992124
图片
编辑:对不起,我想我误解了这个问题。为此,您需要找到 2 个椭圆函数之间的交集或者您可以使用 sympy http://docs.sympy.org/dev/modules/geometry.html