将平方 x,y 坐标转换为圆坐标

Transforming squared x,y coordinates to circle coordinates

我有一个圆,我想用 x,y 坐标在里面画点。

例如,我可以使用什么来使极端点落在圆内?

谢谢

编辑:绘图显示落在圆圈外的点和等效点:

使用毕达哥拉斯定理计算点到原点的距离。 如果该距离 a^2 + b^2 = c^2 <= 圆半径,我们必须得出结论,该点落在圆边界内。如果该点落在外面,只需设置 c == radius 并保存差异,如果您愿意的话。

所以你想把正方形变成内切圆。先来看看:

  • Procedural generation of stars with skybox

它与您的问题非常相似,只是在 3D 和缩放到表面而不是仅仅缩放。移植它以满足您的需求如下所示:

  1. 检测哪个坐标是abs max
  2. 根据相对于 abs 最大坐标轴的角度计算从正方形到圆形的比例
  3. 应用比例

这里是简单的 C++/OpenGL 示例,假设 2D 轴对齐的正方形大小 2*r(0,0) 为中心:

void gl_draw()
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glDisable(GL_DEPTH_TEST);

    int i;
    float x,y,xx,yy,a,r=0.75;
    RandSeed=123456;
    glBegin(GL_POINTS);
    for (i=0;i<10000;i++)
        {
        // random square point <-1,+1>
        x=2.0*(Random()-0.5);
        y=2.0*(Random()-0.5);
        // with 75% hollow inside
        xx=fabs(x);
        yy=fabs(y);
        if ((xx>=yy)&&(xx<0.75)) continue;
        if ((xx< yy)&&(yy<0.75)) continue;
        // size 2*r
        x*=r;
        y*=r;
        // render square point
        glColor3f(1.0,0.3,0.3);
        glVertex2f(x,y);
        // morph to circle
        xx=fabs(x);
        yy=fabs(y);
        if (xx+yy<=1e-10)   // avoid division by zero
            {
            x=0; y=0;
            }
        else if (xx>=yy)    // x is major axis
            {
            a=atan(yy/xx);  // angle
            a=cos(a);       // inscribed circle scale
            x*=a;
            y*=a;
            }
        else{               // y is major axis
            a=atan(xx/yy);  // angle
            a=cos(a);       // inscribed circle scale
            x*=a;
            y*=a;
            }
        // render circle point
        glColor3f(0.3,0.3,1.0);
        glVertex2f(x,y);
        }
    glEnd();

    glFlush();
    SwapBuffers(hdc);
    }

预览:

我用的是空心正方形,所以可以清楚地看到正方形和圆点之间的对应关系(全区域看不太清楚)

所以 (x,y) 的变形是这样完成的:

// morph square (x,y) to circle (x,y)
float xx,yy,a;
xx=fabs(x);
yy=fabs(y);
     if (xx+yy<=1e-10) a=0.0;
else if (xx>=yy) a=cos(atan(yy/xx));
else             a=cos(atan(xx/yy));
x*=a;
y*=a;

并且不要忘记包含 math.h 或等同物...