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

时间:2011-04-21 18:26:15

标签: algorithm language-agnostic plot geometry

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

6 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:1)

圆的面积是A = Pi * r 2 。你从这个区域开始并且(显然)想要半径,所以我们将两边除以Pi得到:r 2 = A / pi。取两边的平方根然后给我们:r=sqrt(A/pi)。获得半径后,使用大多数常规算法绘制应该很简单。

答案 2 :(得分:1)

一个简单的(但有点天真的方法)是简单地计算Bresenham算法针对给定半径绘制的像素数,然后使用二分搜索来找到产生所需像素数的半径。

答案 3 :(得分:0)

我的第一个想法是使用具有子像素精度的算法。考虑如果你的中心有不合理的坐标而你逐渐增加半径会发生什么。当它们被包含在圆圈中时,这将填充周边的看似随机的像素。您希望避免对称性导致圆的4个象限同时添加像素,以便您更接近添加单个像素。如何实现这样的事情我没有任何线索。

我必须解决一次3d版本的单个实例。我需要在球体内部的一组格点小于或等于255. IIRC如果r * r = 15,则球体内有240个点。我并不担心完全得到255。

答案 4 :(得分:0)

据说你总共有2000个像素组成了你的整个圆圈。完成后我的意思是像素不应该破损,必须相互连接。由于2Pi * R =圆周,圆的直径的运行长度,这是您拥有的像素总数。现在简单地写R = 2000/2 * Pi,这将给你半径。现在你应该能够绘制一个由2000像素组成的圆圈。我希望这就是你想要的。

答案 5 :(得分:0)

让我们忘记一秒钟的像素,让我们通过基本的数学/几何学。

我们都知道

  

圆的面积= Pi *半径^ 2

与说

相同
  

圆的面积= Pi *(直径/ 2)^ 2

我们都知道

  

围绕圆圈的正方形区域(即正方形的每一边与圆相切)=直径*直径

因此

  

圆形区域与方形区域的比率=圆形区域/方形区域=(Pi *(直径/ 2)^ 2)/(直径*直径)= Pi / 4

现在让我们假设我们有一个圆形和正方形,其像素数足够大,这样我们就不必担心圆边界周围的麻烦边缘情况了。事实上,让我们假设我们有一个非常大的直径(可能是10,000甚至无限)。有了这个假设,以下成立:

  

圆圈中的像素数=(方形像素数)*(圆形区域与方形区域的比率)

换句话说,对于足够大量的像素,完美绘制的圆的面积与完美绘制的正方形的面积的比率将近似像素化圆中的像素数与封闭中的像素数的比率。像素化广场。

现在在像素化的正方形中,该正方形中的像素数是像素数高的像素数。或者换句话说,它是方形的直径(以像素为单位)的平方。我们称这个方块的像素直径 d 。所以用上面的公式代替我们:

  

圆圈中的像素数量=(d * d)*(Pi / 4)

现在让我们解决 d

  

d = Sqrt(4 *(圆圈中的像素数)/ Pi)

我们之前说过 d 是正方形的直径。那么它也恰好是圆的直径。因此,当您想要绘制具有特定像素数的圆时,可以绘制直径为:

的圆
  

圆的直径= Sqrt(4 *(圆形区域中所需的像素数)/ Pi)

现在很明显你必须做出一些关于舍入等的选择(没有分数像素这样的东西),但是你明白了。此外,该公式更精确,因为圆形区域的所需像素数增加。对于少量像素,舍入误差可能无法为您提供恰当数量的像素。