我已经绘制了几个随机放置的圆圈,但每次运行程序时我都想要不同数量的圆圈。所以问题是如何在随机时间调用函数?
我还需要它们具有凸面和凹面效果,但无法将它们排列成随机圆圈。
最后,我需要圈子不要重叠,我该怎么做?
以下是我目前的部分代码。
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();
}
答案 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 。该算法在平面上生成点的均匀随机分布,使得它们彼此相距一定距离。然后只使用这些点作为圆心。
答案 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);
只有可能的方式,希望它对你有用,祝你好运。