我想获取图像中圆周的像素值,并绘制它们。 我知道周长是 C=2*pi*radius,但我不确定如何迭代圆中的所有点来获取像素数据。
要获得单个像素,这可行。但我需要获取沿圆周的像素值。我应该如何迭代来获取该数据?
$pixel=getPixel($image, $x, $y);
最佳答案
在这里查看答案 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
或者有其副本来避免 2int/double
转换。xx,yy
是最后使用的像素坐标,以避免多次处理单个像素。 开始时,为了安全起见,设定点不在圆圈内。如果r==0
那么你应该设置dt
一些安全值,如dt=M_PI;
关于php - 如何获取沿圆周的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25800367/