极地长方形和背面

我有点卡住了.我正在尝试实现一个基本的极性到矩形的转换,以匹配Photoshop的,但我没有得到相同的结果.

从矩形转换为极性匹配Photoshop但从极性转换为矩形则不然.

你可以在这张图片中看到Photoshop和我之间的差异:

float a, b, ang, dist;
int px, py;
const PI=3.141592653589793;

// Convert from cartesian to polar
for (y=y_start; y<y_end; ++y)
{
    for (x=x_start; x<x_end; ++x)
    {
        a = (float)(x-X/2);
        b = (float)(y-Y/2);

        dist = (sqr(a*a + b*b)*2.0);

        ang = atan2(b,-a)*(58);
        ang = fmod(ang + 450.0,360.0);

        px = (int)(ang*X/360.0);
        py = (int)(dist);

        pset(x, y, 0, src(px,py,0));
        pset(x, y, 1, src(px,py,1));
        pset(x, y, 2, src(px,py,2));
    }
}

// Convert back to cartesian
for (y=y_start; y<y_end; ++y)
{
    for (x=x_start; x<x_end; ++x)
    {

        ang = ((float)x/X)*PI*2.0;

        dist = (float)y*0.5;

        px = (int)(cos(ang)*dist)+X/2;
        py = (int)(sin(ang)*dist)+Y/2;

        pset(x, y, 0, pget(px,py,0));
        pset(x, y, 1, pget(px,py,1));
        pset(x, y, 2, pget(px,py,2));
    }
}

这是我的代码.我敢肯定我已经把极地的东西搞砸到了笛卡儿.该语言基于C.

我究竟做错了什么?有什么建议?

最佳答案 你的极地 – 笛卡尔变换有两个问题:

>用于定义角度的坐标系的轴指向右(x)和向下(y),同时使用具有向上 – (x)和向左(y)轴的坐标系为笛卡尔到极坐标系转型.将角度转换为笛卡尔的代码应该是(我添加了一些舍入)

px = round(-sin(ang)*dist + X/2.)
py = round(-cos(ang)*dist + Y/2.)

使用该代码,当在那里增加x坐标时,在最终图片中,您将从红色变为绿色变为蓝色,而不是从灰色变为蓝色变为绿色.
>假设pget和pset在同一位图上运行,那么您将覆盖源图像.循环结构沿着源图像中心的同心圆向外引导,同时从上到下逐行填充目标.在某些时候,圆和线开始重叠,你开始读取你之前修改过的数据(发生在类似抛物线的形状的顶点).它变得更加复杂,因为在某些时候你开始阅读修改后的数据的变换,以便它再次有效地转换(我猜这会导致右边的不规则三角形区域).

点赞