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

标签 c++ opengl random

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

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

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

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

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/

相关文章:

javascript - 函数的Setter/Getter在调用函数时将函数转换为字符串?

android - admob 广告频率(频率上限)如何运作?

c++ - 在 CPP 中取反 INT_MIN

c++ - OpenGL 扭曲纹理

c++ - 体系结构 x86_64 :"_glutInit"的 undefined symbol ,从 Mac 上的 :_main in main. o/Netbeans 引用

c++ - OpenGL nvoglv32.dll 错误

bash - 在 bash 中使用 $RANDOM + $FLOOR 有什么问题?

java - 如何在数组中生成随机 double ?

c++ - Qt Creator - 如何添加编译器?

c++ - 指针的这些用法有什么区别?