我想画两个半径相同的圆,但不包括重叠的区域。
我想在灰色区域绘制或设置点。
我实现了它背后的数学方面,下面是我的代码:
void draw_venn(){
float radian_to_degree_theta=2 * 3.14 / 360,
r = 0.5,
distance=0.3,
theta=0.0,
theta2=0.0,
xR=0.0,
yR=0.0,
xG=0.0,
yG=0.0,
sum_radii=0,
dis=0.0;
sum_radii=r+r;
for (r = 0.5; r >=0; r-=0.001)
{
for (float degree = 0; degree < 361; degree+=0.1)
{
theta =degree*radian_to_degree_theta;
xR=r*cos(theta)+distance;
yR=r*sin(theta);
xG=r*cos(theta)-distance;
yG=r*sin(theta);
dis=sqrt(pow(xR-xG,2) + pow(yR-yG,2));
if (dis <= sum_radii)
{
set_point(xR,yR,0.1,1,0,0);
set_point(xG,yG,0.1,0,1,0);
}
}
}
}
void set_point(float x,float y,float size,float R,float G,float B){
glPointSize(size);
glBegin (GL_POINTS);
glColor3f (R, G, B);
glVertex2f(x, y);
glEnd ();
}
void draw(void)
{
glClearColor (1, 1, 1, 0);
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix();
draw_ven();
glPopMatrix ();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(1400, 1400);
glutInitWindowPosition(700, 500);
glutCreateWindow("GL Sample");
glutDisplayFunc(draw);
glutMainLoop();
return 0;
}
结果如下:
如何确定点是否在重叠区域内?
2条答案
按热度按时间o2gm4chl1#
我检查并测试了你的代码。三角学可能会变得有点棘手。下面是“draw_venn”函数,它做了一些改进以产生重叠效果。
指出两个重要的修改,首先,我推导了“theta”的镜像值,并将其放入变量“theta2”中。它用于绘制红色圆圈。这确保了圆圈图像是以相等但相反的方向构建的,以便坐标对称。其次,我修改了检查绿色图像坐标是否落在红色圆圈最外半径内的公式。使用勾股定理计算斜边,公式确定斜边值是否小于最外半径长度(0. 5)。如果斜边值小于最外半径长度,则将绿色圆的该点设置为蓝色,并且由于圆点是对称构建和着色的,因此也将红色圆的相应点设置为蓝色。
这些修订的结果是显示重叠的维恩图。
我希望这对你有所帮助,并给你一个跳板继续前进。
祝你好运
bd1hkmkf2#
1.将8位Stencil Buffer添加到您的上下文
我是这样设置pixelformat的:
1.使用
0
启用并清除模具,并将其设置为递增1.禁用颜色和深度输出
1.渲染圆形
1.启用颜色和深度输出
1.将模具测试设置为不等于
2
如果重叠的对象不止2个,也可以使用等于1
1.渲染圆形
1.禁用模具测试
我是这样看的:
与输出:
如果你还想知道像素是否在两个圆圈内,你可以用途:
如果你坚持一个像素一个像素地渲染东西,那么至少要正确地做因为你目前的方法是horibly缓慢的许多原因...例如,你可以这样做:
其中
xs,ys
是GL屏幕分辨率。参见相关: