绘制一个具有特定像素数的圆

dew*_*rn1 5 language-agnostic algorithm plot geometry

我正在开展一个项目,要求我准确地控制用于绘制(粗略)圆形刺激的像素数量,尽管Bresenham的算法很棒,但它们并没有绘制任意区域的圆圈(据我所知) .我已经尝试过在绘制所需区域时中断Bresenham算法的脚本,但结果肯定是命中注定.有没有人知道使用给定数量的像素绘制"最佳"圆(有点主观,我知道)的方法?非常感谢!

Ben*_*min 5

这样做的一种粗略方式,例如:

面积为1000平方px的圆的半径是sqrt(1000/pi)= 17.8 ......那个圆应该适合35x35矩阵.如果为中心像素为(0,0)的矩阵制作"索引",则可以通过替换为圆的等式来轻松检查像素是否落入圆中x ^ 2 + y ^ 2 = r ^ 2.或者,您可以将替代方程用于以(a,b)为中心的圆.如果它的评估结果为TRUE,那么它确实如果不是,它就在圆圈之外.

作为伪代码/示例,在Python中我会做一个优化版本:

import numpy, math

target_area = 1000.0

r = (target_area / math.pi) ** 0.5
m = numpy.zeros((2*r+2,2*r+2))

a, b = r, r

for row in range(0, m.shape[0]):
    for col in range(0, m.shape[1]):
        if (col-a)**2 + (row-b)**2 <= r**2:
            m[row,col] = 1

numpy.sum(m)
#>>> 999
Run Code Online (Sandbox Code Playgroud)

以下是目标区域为100,000像素(生成的实际圆为99988.0)时的结果: 圈

您还可以使用此算法编写一个例程来查找哪些区域可以比其他区域更紧密地匹配,并选择这些值以确保符合性.


Jer*_*fin 1

圆的面积为A=Pi*r 2。您从该区域开始并且(显然)想要半径,因此我们将两边除以 Pi 得到:r 2 =A/pi。两边同时开平方根就可以得到:r=sqrt(A/pi)。一旦有了半径,使用大多数普通算法进行绘图应该很简单。