如何沿圆周获取像素

时间:2014-09-12 03:40:57

标签: php algorithm loops pixel geometry

我想获取图像中圆周的像素值,并绘制它们。 我知道Circumference是C = 2 * pi * radius,但我不确定如何遍历圆中的所有点来获取像素数据。

要获得单个像素,这将有效。但我需要沿着圆周获得像素值。我应该如何迭代才能获得这些数据?

$pixel=getPixel($image, $x, $y);

2 个答案:

答案 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

但对于新手而言,实施起来可能很困难,而且更难理解

如果您想要简单(或开始),那么:

  1. 使用参数圆方程

    x=x0+r*cos(t)
    y=y0+r*sin(t)
    

    根据您的t= <0,2*pi) [rad]函数

  2. deg使用radsin,cos时获取圆圈边界的像素位置
  3. 仅限像素

    圆周长度为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;