【发布时间】:2016-10-02 08:20:12
【问题描述】:
我想用随机放置的点填充一个平面,检查它们是否重叠(如果重叠,将其中一个移动到空白处),然后计算它们之间的平均距离。稍后我计划将其扩展到 3D,以便它在盒子中包含粒子。 我知道必须有更好的方法来做到这一点,但这就是我想出的。在平面上放置随机点:
int pos[NUMBER][2]; /* Creates an array of NUMBER amount of points with x and y coordinate */
int a, b;
srand( time(NULL) );
for(a=0;a<NUMBER;a++)
for(b=0;b<2;b++)
pos[a][b]=rand()%11; /* Using modulus is random enough for now */
下一阶段是寻找重叠的点:
for(a=0;a<NUMBER-1;a++)
for(b=a+1;b<NUMBER;b++)
if( pos[a][0] == pos[b][0] && pos[a][1] == pos[b][1])
printf("These points overlap:\t", pos[a][0], pos[a][1]);
现在,当我确定哪些点重叠时,我必须移动其中一个,但是当我这样做时,新位置的点可能与之前的点之一重叠。有没有公认的方法来解决这个问题?一种方法是具有中断条件的无限 while(true) 循环,但这似乎非常低效,尤其是当系统变得密集时。 谢谢!
【问题讨论】:
-
我不知道“接受”的方式,但我想我可以在 O(
NUMER*log(GRID_SIZE)) 时间内提供解决方案,其中GRID_SIZE是可能职位的总数。小参数可能更慢,但大参数更快。 -
为什么不在放置点时检查重叠?您需要某种数据结构才能使其相当有效。