(Python)使用for循环创建形式为p=[a,b,c]的X点,然后使用第二个for循环在p=[a,b,c]'Y'时间内随机化a,b,c?

2024-06-23 18:37:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为所有人都可以回答这个问题,但为了提供更多的背景知识,我正在使用python为rhino编写代码。我的目标是创建一个由X点组成的曲线。这些点还必须随机位于10×80×20单位的矩形棱镜内。我从这个开始:

import rhinoscriptsyntax as rs
import random

crvNumber = 300
numRandPts = 5
xLength = 10
yLength = 80
zLength = 20
crvArray = []
crvPtArray = []

for j in range(0,numRandPts):

    ptj = [xLength*random.random(),yLength*random.random(),zLength*random.random()]
    crvPtArray.append(ptj)

for i in range(0,crvNumber):

    curves = rs.AddCurve (crvPtArray, degree = numRandPts)
    crvArray.append(curves)

我相信你能马上发现这是行不通的,因为随机点的生成发生在第一个for循环中,结果,第二个for循环只输出相同的随机曲线300次。有没有人知道我如何在第一个循环中生成特定数量的点,然后在第二个for循环中实际分配它们的值,这样我就得到了300条带有j个随机点的曲线?在过去的两个小时里,我一直在研究这个问题,但没有结果。我的第一个解决方法是,也许只生成一组,比如说1000个随机点,然后在第二个for循环中选择其中的j点会更简单。但是,我遇到了无法从列表中进行选择的问题(“list objects are unhable”错误),这段代码(我基本上是在中复制了for k)随机抽样我在这里找到了一个例子):

for j in range(0,randomLevel):

    ptj = [xLength*random.random(),yLength*random.random(),zLength*random.random()]
    crvPtArray.append(ptj)

for i in range(0,crvNumber):

    crvPtArray2 = (crvPtArray[k] for k in random.sample(xrange(0,len(crvPtArray)), numRandPts))
    curves = rs.AddCurve (crvPtArray2, degree = numRandPts)
    crvArray.append(curves)

在这里,我无意中发现了python中的词典主题,并对这些主题进行了测试,但找不到一种方法只打印存储在词典中的“定义”列表,而不打印冒号附加在“定义”后面的“单词”。然后我意识到,即使我能做到,随机化仍然会发生在dictionary for loop中,而不是曲线生成for loop(除非我错了,它会在第二个for loop中随机化)。所以我试着用pt[j]=[]生成空白点,并试着在生成for循环的曲线中进行随机化。不幸的是,我没有真正取得任何成功,因为我完全超出了我的深度,这一点,只是试图编代码,似乎它可能会工作。你知道吗

有没有办法创建X个空白变量或点,然后追溯定义/随机化它们?有没有办法让我的设置和随机样本的想法发挥作用?有没有什么疯狂的嵌套编码或者其他什么东西可以解决这个问题?你们能提供的任何见解都将不胜感激。你知道吗

(我的代码中有任何非常愚蠢的错误,它们可能是转录的,但如果有任何真正愚蠢的错误,它们可能是我的;)


Tags: 代码inforrangerandom曲线rsappend
1条回答
网友
1楼 · 发布于 2024-06-23 18:37:53

独立于rhino我理解你想要一个由3D点组成的2D数组。你知道吗

这里是基本的Python方式(无依赖关系),它是一个3D点列表(本身是三个值的列表)。要获得一条曲线,只需创建一个标准的空python列表pts=[],然后在循环中向其添加3D点:

for j in range(0,numRandPts):
    pt = [random...,random..., random....]   # xyz
    pts.append(pt)

现在,将其包装到所有曲线的另一个循环中。你知道吗

crvs=[]
for i in range(0, numCrvs):
    pts=[]   #these will be overwritten for each new curve
    for j in range(0,numRandPts):
        pt = [random...,random..., random....]   # xyz
        pts.append(pt)
    crvs.append(pts)

crvs现在是三维点列表。你知道吗

对于速度,你可以用numpy做得更好。查一下numpy.zeros数(..)命令,该命令允许您生成任意维度的数组,您可以用数字填充该数组。你知道吗

相关问题 更多 >

    热门问题