2017-05-09 171 views
0

我正在为高精度测量编程应用程序。现在我有一个问题。通过两点绘制精确圆圈

用户可以在轴X上选择一个代表圆的直径的线段。 如果选定的直径具有偶数像素长度,我如何通过两个选定的终点画圆圈 在这种情况下,圆的原点将在两个像素之间,这将使我选择其中一个像素,从而将圆圈移动一个像素左或右。 确实,外观不会改变,因为一个像素将被包含,另一个像素被添加到选定片段的另一侧,但如果我需要首先根据片段在该区域周围的长度绘制一个正方形,该怎么办? 然后圆形和方形会碰到错误的地方。

在这种情况下通常会做什么?

+0

通常做的是让圆的中心位于半像素边界上。 –

+0

这是如何完成的。我的意思是,绘制正确的圆圈,我可以想象(使用极坐标到三角或圆弧方程的笛卡尔坐标),但是如果您必须绘制原点,还是要放置原点的位置?你使用两个像素还是简单地忽略它在数学上不正确的事实?我的意思是,你不能在两个像素之间绘制。 :D – Dalen

回答

0

ImageDraw.Draw.ellipse以边界框为参数。它并不关心圆圈的中心位置。

圆形轮廓包含我执行的测试中边界框的所有4个边。我建议你也做你自己的测试。

从两个任意点计算边界框很容易,一旦你有圆的直径和中心。

diameter = ((x2 - x1)**2 + (y2 - y1)**2) ** 0.5 
radius = diameter/2 
xC, yC = (x1 + x2)/2.0, (y1 + y2)/2.0 
bbox = [round(xC - radius), round(yC - radius), round(xC + radius), round(yC + radius)] 
+0

是的,我知道,但我仍然在意当我使用它时会发生什么。将真正的椭圆画出来,而不是一个圆,以接触边长为D的边界框四边形的所有边。或者,它会绘制一个真实的圆,但是使用R = int(D/2.0)并且向右保留一个像素,一个下降圈免费? – Dalen