【问题标题】:How to get pixel along circumfrence如何沿圆周获得像素
【发布时间】:2014-09-12 03:40:57
【问题描述】:

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

要获得单个像素,这将起作用。但我需要沿圆周获取像素值。我应该如何迭代以获取该数据?

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

【问题讨论】:

标签: php algorithm loops pixel geometry


【解决方案1】:

在这里查看答案3D sphere boundary

它与您的问题 3D 等效,因此可能会有所帮助,但如果您还需要正确的像素顺序,那么这很可能不适合您。

如果您想提高速度,请使用 Bresenham

但对于新手来说,它可能难以实施,甚至更难理解

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

  1. 使用参数圆方程

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

    根据您的sin,cos 函数,t= <0,2*pi) [rad] 使用 degrad 时为您提供圆边界的像素位置

  2. 仅像素

    圆的周长是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;

【讨论】:

  • 如果我使用 Bresenham 的圆算法,我是否只需要遍历 x(或 y)?
  • @j0h on mcdowella 的答案是与 C++ 实现的链接,您循环 x 并沿 1/8 圈迭代 y,然后将像素的所有镜像获得完整的圈。这就是为什么停止条件是 x&lt;=y 并且每次迭代有 8 个 putpixel 调用
【解决方案2】:

一种方法是在屏幕上创建圆形图像时复制用于绘制像素的低级代码。这通过增加(或减少)一个坐标然后调整另一个坐标以保持与圆心的距离相同。为确保它是对称的,请确保以完全相同的方式绘制圆的每个八分圆。详情请见http://www.asksatyam.com/2011/01/bresenhams-circle-algorithm_22.html(当然是http://en.wikipedia.org/wiki/Midpoint_circle_algorithm)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2018-03-31
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多