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

时间:2014-10-09 05:31:40

标签: 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();
}

2 个答案:

答案 0 :(得分:4)

简单方法

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

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();

不重叠

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

天真的一代

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

缓解

您还可以考虑将所有圆圈视为与弹簧连接的点系统并迭代几次,以使弹簧相互排斥圆圈,从而符合非重叠规则。

Poisson Disk Sampling

您可以在互联网上了解如何实施 Poisson Disk Sampling 。该算法在平面上生成点的均匀随机分布,使得它们彼此相距一定距离。然后只使用这些点作为圆心。

答案 1 :(得分:0)

如何在随机时间调用函数?

这样做的一种方式:

if (rand() % someNumber == 0)
 callFunc();

我还需要它们具有凸面和凹面效果,但无法将它们排列成随机圆圈。  我不明白你的意思。

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

首先,您需要在结构中创建圆圈,并将它们存储在集合中。假设你的结构是这样的:

struct Circle {
 float x, y, raduis;
}

和这样的集合:

std::vector<Circle> circles;

然后创作可能如下:

Circle c;
do {
 bool canExit = true;
 c.x = rand()*350;
 c.y = rand()*250;
 c.radius = 50;

 for (int i = 0; i < circles.size(); i++) {
  float dx = (circles[i].x - c.x);
  float dy = (circles[i].y - c.y);
  floar radii = circles[i].radius + c.radius;
  if (dx*dx + dy*dy < (radii*radii) ) {
   canExit = false;
   break;
  }
 }

while(canExit == false);

circles.push_back(c);
只有可能的方式,希望它对你有用,祝你好运。