Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 极性到矩形和背面_C_Graphics_Polar Coordinates - Fatal编程技术网

C 极性到矩形和背面

C 极性到矩形和背面,c,graphics,polar-coordinates,C,Graphics,Polar Coordinates,我有点困了。我试图实现一个基本的极坐标到矩形的转换,以匹配Photoshop的,但我没有得到相同的结果 从矩形到极轴的转换匹配Photoshop,但从极轴到矩形的转换不匹配 你可以在这张图片中看到Photoshop和我的不同之处: float a、b、ang、dist; int-px,py; 常数PI=3.141592653589793; //从笛卡尔坐标转换为极坐标 对于(y=y_start;y而言,极坐标到笛卡尔坐标变换存在两个问题: 用于定义角度的坐标系的轴指向右(x)和下(y),而用

我有点困了。我试图实现一个基本的极坐标到矩形的转换,以匹配Photoshop的,但我没有得到相同的结果

从矩形到极轴的转换匹配Photoshop,但从极轴到矩形的转换不匹配

你可以在这张图片中看到Photoshop和我的不同之处:

float a、b、ang、dist;
int-px,py;
常数PI=3.141592653589793;
//从笛卡尔坐标转换为极坐标

对于(y=y_start;y而言,极坐标到笛卡尔坐标变换存在两个问题:

  • 用于定义角度的坐标系的轴指向右(x)和下(y),而用于笛卡尔到极坐标变换的坐标系的轴指向上(x)和左(y)。将角度转换为笛卡尔坐标的代码应该是(我添加了一些舍入)

    使用该代码,当增加x坐标时,在最终图片中从红色到绿色再到蓝色,而不是从灰色到蓝色再到绿色

  • 假设
    pget
    pset
    操作在同一位图上,则覆盖源图像。循环构造沿源图像中心周围的同心圆向外,同时从上到下逐行填充目标。在某个点上,圆和线开始重叠,然后开始读取之前修改过的数据(发生在抛物线形状的顶点)。它变得更加复杂,因为在某个点上,您开始读取修改过的数据的变换,从而使其再次有效地变换(我猜这会导致右侧的不规则三角形区域)

你应该正确地格式化你的代码,使其更具可读性。什么是大X和Y?为什么你在
float
中做十进制算术而不是
double
?神奇的数字58和450.0是什么,也就是说,它们来自哪里?是的,很抱歉,它不是很清楚。大X是屏幕宽度,大Y是屏幕高度。没有58,polar转换没有正确包装。这些是我发现的代码片段,所以我也在尝试清理它们并更好地理解它们。58~=180.0/PI。显然,你并不真的想转换为度,然后再转换回弧度。因为你的极坐标到笛卡尔函数不是笛卡尔坐标到极坐标的反函数。你需要d将角度恢复到
[-π/2,π/2]
范围,并反转
x
值。
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));
    }
}
px = round(-sin(ang)*dist + X/2.)
py = round(-cos(ang)*dist + Y/2.)