繁体   English   中英

生成不重叠的坐标

[英]Generate co-ordinates that do not overlap

我有一个随机放置线元素的程序。 但是,我希望这些线条不要重叠或交叉(线条完全不接触)。

查找有关如何执行此操作的示例,通常使用一个循环遍历多个线元素并生成一个坐标,然后在该循​​环内使用另一个循环检查该坐标是否在最小距离处。

从到目前为止的经验来看,使用循环确实会使程序费劲,并且在显示刺激时,帧会下降。

我这样做的另一个想法是生成一个坐标列表,然后计算每个坐标的距离。 到目前为止,我拥有的代码如下:

import numpy as np
import scipy.spatial.distance
import random

length_line=12
nLines = 1000  #the number of line elements that I want

#Random coordinates for the lines. 500X500 pixels centred around 0
xys = np.random.random([nEls,2])*500-250   

#Calculating the distance of the centre of the lines from each other
dist = scipy.spatial.distance.pdist(xys)

minDist = (length_line/2)+2  #the minimum distance that should not cause overlap

print sys

我不太确定如何从这里开始-理想情况下,我希望程序保持最小距离minDist设置的minDist的坐标,并可能用其他东西代替没有坐标。

这可能吗? 谢谢。

如果我的理解是正确的,你想生成线部分不彼此部分重叠? (但是他们可以交叉,对吗?)。 在以下建议中,线段和线之间的区别至关重要。

该方法是通过简化问题:通过将线段扩展为线 (无限长)来实现的 检验两条线不重叠是微不足道的(基本上,一条线是一阶函数,用f(0)和一个梯度表示)。

在这里,我对二维空间进行了推理,但是可以将其扩展到三维空间。

两个应避免接近的重叠,您必须以某种方式将f(0)和渐变四舍五入 (例如,小数点后的一位或两位数)。 那应该比计算距离更快。

每次生成新细分时,您:

  1. 将线段展开为一条线(计算梯度和f(0))。
  2. 检查该梯度是否没有预先存在的线。 该测试应消除大多数候选人。
    • 一种快速的方法是实现一个哈希表,其中的键是渐变,值是f(0)(起点和终点)。
  3. 如果有候选人,请检查f(0)。 那也应该消除大多数剩余的候选人。
  4. 最后比较一下这两个线段没有重叠-因为您已经知道它们都在同一条线上,所以第一个线段的最高点(y维)不应大于第二个线段的最低点,反之亦然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM