gpt4 book ai didi

c++ - OpenGL-如何随机绘制不重叠的圆

转载 作者:行者123 更新时间:2023-11-27 23:02:34 25 4
gpt4 key购买 nike

我已经画了几个随机放置的圆圈,但每次运行程序时我都想要不同数量的圆圈。所以真正的问题是我如何随机调用一个函数?

我还需要它们具有凸凹效果但无法将它们排列成随机圆圈。

最后,我需要圆圈不重叠,我该怎么做?

到目前为止,以下是我的部分代码。

void circle(){
double r=50;
int dx, dy;
dx=rand()%350;
dy=rand()%250;
glLineWidth(1);
glEnable(GL_LINE_SMOOTH);
glBegin(GL_LINES);
double i=1.0;
double j=0.0;
for (double y=r; y>=-r; y=y-1) {
i=i-0.01;
j=j+0.01;
//glColor3f(i, i, i);
glColor3f(j, j, j);
glVertex2f(-sqrt(r*r-y*y)+dx, y+dy);
glVertex2f(sqrt(r*r-y*y)+dx, y+dy);
}


glEnd();

}

void display(void){

glClear(GL_COLOR_BUFFER_BIT);
srand((unsigned)time(0));
circle();
circle();
circle();


glEnd();
glFlush();
}

最佳答案

简单的方法

选择一个随机数并进行迭代就足够了。这可能会导致圆圈重叠。

int min_circles = 10;
int max_circles = 100;

int amount = min_circles + rand()%(max_circles-min_circles+1);

for (int i = 0; i < amount; i++)
circle();

不重叠

这不是一件小事,一直是一个有趣的研究课题。例如,您可以采用多种方法解决此问题:

天真的一代

存储所有之前添加的圆圈位置,如果您尝试添加一个新的圆圈位置,只需检查之前的圆圈位置是否重叠。如果它重叠选择另一个位置。如果连续失败几次则停止。

缓和

也可以考虑把所有的圆看成一个由 Spring 连接的点系,迭代几次,使 Spring 相互排斥,符合不重叠的规则。

泊松盘采样

您可以在 Internet 上阅读有关实现Poisson Disk Sampling 的内容。该算法在平面上生成点的均匀随机分布,使它们彼此相距一定距离。然后就用这些点作为圆心。

关于c++ - OpenGL-如何随机绘制不重叠的圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26270977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com