(Python) Создание 'X' точек формы p = [a,b,c] с использованием цикла for, а затем рандомизация a, b, c в течение p = [a,b,c] 'Y' раз с использованием секунды для цикла?

Я думаю, что на этот вопрос могут ответить все, но для большей информации я использую python для кодирования носорога. Моя цель - создать ряд кривых из 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 случайными точками? Я исследовал это в течение последних 2 часов безрезультатно. Моя первая обходная идея заключалась в том, что, возможно, было бы проще просто сгенерировать, скажем, 1000 случайных точек, а затем выбрать j из них во втором цикле for. Тем не менее, я столкнулся с проблемой невозможности выбора из списка (ошибка "объекты списка нечитаемы") с этим кодом (я в основном скопировал бит k для random.sample из примера, найденного здесь):

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 и проверил их, но не смог найти способ просто напечатать список "определений", хранящихся в словаре, а не "слова", присоединенные двоеточием к " определения". И тогда я понял, что даже если бы я мог сделать это, рандомизация по-прежнему происходила бы в словаре для цикла, а не в генерации кривой для цикла (если я не ошибаюсь, и она будет рандомизирована во второй для цикла). Затем я попытался сгенерировать пустые точки с помощью pt[j] = [] и попытался каким-то образом добиться того, чтобы случайность произошла в цикле генерации кривой for. К сожалению, у меня не было никакого успеха, так как к этому моменту я был совершенно не в себе и просто пытался составить код, который, казалось, мог бы работать.

Есть ли способ создать X пустых переменных или точек, а затем задним числом определить / рандомизировать их? Есть ли способ заставить мой набор и идею случайной выборки работать? Есть ли какая-то сумасшедшая вложенная кодировка или что-то, что может сработать для этого? Любое понимание, которое вы можете предложить, будет высоко ценится.

(В моем коде есть действительно очень глупые ошибки, они, вероятно, транскрипционные, но если есть действительно глупые ошибки, они могут быть моими;))

1 ответ

Решение

Независимо от rhino Я понимаю, что вы хотите иметь 2D-массив 3D-точек.

Вот основной способ Python (без зависимостей), который представляет собой список списков трехмерных точек (сами списки из трех значений). Чтобы получить одну кривую, просто создайте стандартный пустой список 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 теперь список списков 3D-точек.

Для скорости вы могли бы сделать это лучше с numpy, Посмотрите на команду numpy.zeros (..), которая позволяет вам генерировать массив произвольных измерений, которые вы можете заполнить числами.

Другие вопросы по тегам