我想获取图像中圆周的像素值,并绘制它们。 我知道Circumference是C = 2 * pi * radius,但我不确定如何遍历圆中的所有点来获取像素数据。
要获得单个像素,这将有效。但我需要沿着圆周获得像素值。我应该如何迭代才能获得这些数据?
$pixel=getPixel($image, $x, $y);
答案 0 :(得分:1)
执行此操作的一种方法是在屏幕上创建圆形图像时复制用于绘制像素的低级代码。这通过递增(或递减)其中一个坐标然后调整另一个坐标以便与圆的中心保持相同的距离来工作。为确保它是对称的,请确保以完全相同的方式绘制圆的每个八分圆。详情请见http://www.asksatyam.com/2011/01/bresenhams-circle-algorithm_22.html(当然还是http://en.wikipedia.org/wiki/Midpoint_circle_algorithm)。
答案 1 :(得分:1)
在这里查看答案3D sphere boundary
它 3D 相当于你的问题所以它可能会有所帮助,但是如果你还需要像素顺序,那么很可能这不适合你。
如果你想要速度使用Bresenham
但对于新手而言,实施起来可能很困难,而且更难理解
如果您想要简单(或开始),那么:
使用参数圆方程
x=x0+r*cos(t)
y=y0+r*sin(t)
根据您的t= <0,2*pi) [rad]
函数
deg
使用rad
或sin,cos
时获取圆圈边界的像素位置
仅限像素
圆周长度为2*pi*r [pixels]
,因此参数t
的步长应足够小,以达到尽可能多的点数
dt <= 2*pi/2*pi*r // whole circle / number of pixels
dt <= 1/r // let use half of that for safety
因此,对于提取点,请使用此C ++代码:
int x0=...,y0=...,r=...; // input values
int xx=x0+r+r,yy=y0,x,y;
double t,dt=0.5/r;
for (t=0.0;t<2.0*M_PI;t+=dt)
{
x=x0+int(double(double(r)*cos(t)));
y=y0+int(double(double(r)*sin(t)));
if ((xx!=x)&&(yy!=y)) // check if the coordinates crossed pixel barrier
{
xx=x; yy=y;
// here do what you need to do with pixel x,y
}
}
如果周边有洞,则再降低dt
。您使用的步骤越小,但它也会减慢整个过程。您可以r
作为double
或拥有副本,以避免2 int/double
次转化。 xx,yy
是最后使用的像素坐标,以避免多次处理单个像素。
在开始时,为了安全起见,它不是在圆圈内的设定点。如果r==0
,那么您应该将dt
设置为某个安全值,例如dt=M_PI;