将平方 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 和缩放到表面而不是仅仅缩放。移植它以满足您的需求如下所示:
- 检测哪个坐标是abs max
- 根据相对于 abs 最大坐标轴的角度计算从正方形到圆形的比例
- 应用比例
这里是简单的 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
或等同物...
我有一个圆,我想用 x,y 坐标在里面画点。
例如,我可以使用什么来使极端点落在圆内?
谢谢
编辑:绘图显示落在圆圈外的点和等效点:
使用毕达哥拉斯定理计算点到原点的距离。
如果该距离 a^2 + b^2 = c^2
<= 圆半径,我们必须得出结论,该点落在圆边界内。如果该点落在外面,只需设置 c == radius
并保存差异,如果您愿意的话。
所以你想把正方形变成内切圆。先来看看:
- Procedural generation of stars with skybox
它与您的问题非常相似,只是在 3D 和缩放到表面而不是仅仅缩放。移植它以满足您的需求如下所示:
- 检测哪个坐标是abs max
- 根据相对于 abs 最大坐标轴的角度计算从正方形到圆形的比例
- 应用比例
这里是简单的 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
或等同物...