我有一个树(或#34;矩阵"),其中包含一堆行位置点:
tree = [[[x,y],[x,y],[x,y]],
[[x,y],[x,y],[x,y]],
[[x,y],[x,y],[x,y]]]
我的目标是从每个"分支"上的随机点连接更多行。到不同分支上的其他随机点。创建一条线后,两个分支上的位置点将无法用于将来的线创建。
我设法使用random.shuffle()随机化点迭代,但我目前正在一次接受一个分支,并且一次仅将一个分支与一个相邻分支进行比较。这给了我一堆从一个分支连接到它检查的第一个分支的行,但我希望它们遍布整个地方,连接到许多分支。
这是我到目前为止所拥有的。这些功能是Cinema 4D的原生功能。可以在此处找到可搜索的API:https://developers.maxon.net/docs/Cinema4DPythonSDK/html/index.html 函数GetSplinePoint()只返回样条线(3D线)对象的位置。
rand_pts = [_ for _ in xrange(spline_resolution)]
for p_spline in xrange(len(splines)):
random.shuffle(rand_pts)
for p in rand_pts:
if p == 0 or p == spline_resolution-1 or occupied[p_spline][p] == True: continue
mindist = 99999
new_connection = False
p_amt = c4d.utils.RangeMap(p, 0, spline_resolution-1, 0, 1, False)
p_pt = spline_objs[p_spline].GetSplinePoint(p_amt)
for n_spline in xrange(len(splines)):
if n_spline != p_spline:
random.shuffle(rand_pts)
for n in rand_pts:
if n == 0 or n == spline_resolution-1 or occupied[n_spline][n] == True: continue
n_amt = c4d.utils.RangeMap(n, 0, spline_resolution-1, 0, 1, False)
n_pt = spline_objs[n_spline].GetSplinePoint(n_amt)
dist = (p_pt - n_pt).GetLength()
if dist < op[c4d.ID_USERDATA,5] and dist < mindist:
mindist = dist
new_connection = True
break
答案 0 :(得分:0)
搞定了。
我做了一个新列表:
rand_splines = [_ for _ in xrange(len(splines))]
然后在我的第一次和第二次迭代之前使用random.shuffle(rand_splines)
进行洗牌,并使用for spline in rand_splines:
来迭代洗牌列表。