【发布时间】:2014-09-12 03:40:57
【问题描述】:
我想获取图像中圆周上的像素值,并绘制它们。 我知道周长是 C=2*pi*radius,但我不确定如何遍历圆中的所有点来获取像素数据。
要获得单个像素,这将起作用。但我需要沿圆周获取像素值。我应该如何迭代以获取该数据?
$pixel=getPixel($image, $x, $y);
【问题讨论】:
标签: php algorithm loops pixel geometry
我想获取图像中圆周上的像素值,并绘制它们。 我知道周长是 C=2*pi*radius,但我不确定如何遍历圆中的所有点来获取像素数据。
要获得单个像素,这将起作用。但我需要沿圆周获取像素值。我应该如何迭代以获取该数据?
$pixel=getPixel($image, $x, $y);
【问题讨论】:
标签: php algorithm loops pixel geometry
在这里查看答案3D sphere boundary
它与您的问题 3D 等效,因此可能会有所帮助,但如果您还需要正确的像素顺序,那么这很可能不适合您。
如果您想提高速度,请使用 Bresenham
但对于新手来说,它可能难以实施,甚至更难理解
如果您想要简单(或开始),那么:
使用参数圆方程
x=x0+r*cos(t)
y=y0+r*sin(t)
根据您的sin,cos 函数,t= <0,2*pi) [rad] 使用 deg 或 rad 时为您提供圆边界的像素位置
仅像素
圆的周长是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;
【讨论】:
x<=y 并且每次迭代有 8 个 putpixel 调用
一种方法是在屏幕上创建圆形图像时复制用于绘制像素的低级代码。这通过增加(或减少)一个坐标然后调整另一个坐标以保持与圆心的距离相同。为确保它是对称的,请确保以完全相同的方式绘制圆的每个八分圆。详情请见http://www.asksatyam.com/2011/01/bresenhams-circle-algorithm_22.html(当然是http://en.wikipedia.org/wiki/Midpoint_circle_algorithm)。
【讨论】: