作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想获取图像圆周上的像素值,并绘制它们。我知道 Circumference 是 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
或者有它的副本来避免 2 int/double
转换。 xx,yy
是最后使用的像素坐标,以避免多次处理单个像素。开始时,为安全起见,设定点不在圆圈内。如果r==0
那么你应该设置dt
一些安全值,如 dt=M_PI;
关于php - 如何沿圆周获取像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25800367/
我是一名优秀的程序员,十分优秀!