php - 如何获取沿圆周的像素

标签 php algorithm loops pixel geometry

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

要获得单个像素,这可行。但我需要获取沿圆周的像素值。我应该如何迭代来获取该数据?

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

最佳答案

在这里查看答案 3D sphere boundary

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

如果你想要速度,请使用 Bresenham

但对于新手来说可能很难实现,甚至更难理解

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

  1. 使用参数圆方程

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

    它可以获取圆边界的像素位置,而 t= <0,2*pi) [rad]使用degrad根据你的sin,cos功能

  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更多的。越少,您使用的步骤就越小,但也会减慢整个过程。您可以拥有rdouble或者有其副本来避免 2 int/double转换。 xx,yy是最后使用的像素坐标,以避免多次处理单个像素。 开始时,为了安全起见,设定点不在圆圈内。如果r==0那么你应该设置dt一些安全值,如 dt=M_PI;

关于php - 如何获取沿圆周的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25800367/

相关文章:

PHP - strtotime() 返回 1970

javascript - 为什么在 for 循环中声明的变量会更新而不是在每次迭代时重新创建?

java - 从给定长度生成所有可能的字符串

c++ - 在 C++ 中创建 n 个项目的所有可能的 k 个组合

algorithm - 比较两个 3Dmesh

javascript - iMacros 循环然后停止然后添加另一个命令

Java 编程嵌套循环

php - 只允许来自 PayPal 余额的捐款?

php - Laravel 无法排队作业

php - Komodo编辑语法高亮