Работа с двумерными массивами

Если под модификатором Edit_Poly находятся несколько объектов, то если не указать явно, с какими объектами производить действия в этом случае будет обрабатываться лишь какой-то один объект.

Например рассмотрим скрипт, который вычисляет среднее положение выделенных вершин объектов под модификатором Edit_Poly и масштабированием сбрасывает их позиции к этому среднему положению.

Немного про алгоритм: Чтобы посчитать среднюю точку всех выделенных вершин, надо сложить все позиции вершин и разделить полученное на количество вершин.

Другими словами например, среднее положение между 0 и 10 по оси X будет 5, ответ получается из сложения 0 и 10 и делением на количество позиций (а позиций у нас 2). И вот таким же макаром получается вычисление средей точки по всем осям.

Итак начнём:

fo = modPanel.getCurrentObject() --Наш объект панели Modify - в переменную fo

(

arrV=#() -- Пустой массив для добавления в него выделенных вершин

For i=1 to selection.count do /* Для каждого i с единицы до selection.count (числа, равного количеству выделенных объектов) делать*/

append arrV (fo.getSelection #Vertex node: selection[i]) /*в массив arrV добавить fo.getSelection #Vertex (битовый массив вершин) для каждого node: selection[i] (объекта i среди выделенных)*/

/* Результатом выполнения этого цикла будет массив arrV из битовых массивов выделенных вершин всех объектов под модификатором Edit_Poly. */

-- Например #(#{9, 16, 21}, #{9, 16, 21})

if arrV[1].numberset!=0 do -- Если arrV[1].numberset (количество элементов первого бит. массива) не 0, то делать

       (

       sum=[0,0,0] -- сумма всех позиций выделенных вершин (пока равна нулю)

       countV=0 /* количество выделенных вершин (так как у нас массив из бит. массивов, то просто так arrV.count нам не даст количества вершин, поэтому посчитаем количество вершин через тот же цикл, в котором будем считать сумму позиций вершин)*/

       For i=1 to selection.count do /* Для каждого i с единицы до selection.count (числа, равного количеству выделенных объектов) делать*/

       for b=1 to arrV.count do /*-- для b=1 (каждого битМассива b начиная с первого) до arrV.count (количества битМассивов массива arrV) делать*/

       for v in arrV[b] do --для каждой вершины v в битовом массиве b массива arrV делать

                   (

                   vPos=fo.getVertex v node: selection[i] /* fo.getVertex (получить позицию) каждой вершины v */

                   sum+=vPos -- сумма равна сумма+позиция каждой вершины

                   countV+=1 -- счётчик обработанных вершин увеличиваем на 1

                  )

                   midPos=sum/countV -- Средняя позиция = сумма позиций / на счётчик вершин

fo.SetOperation #Transform -- устанавливаем операцию для модификатора Edit_Poly

fo.ScaleSelection [1e-005,1e-005,1e-005] parent:(transMatrix midPos) axis:(transMatrix midPos)

/*Операция масштабирования с параметрами,

[1e-005,1e-005,1e-005] Point3 взята из макрорегистратора для зануления масштаба

Если родитель (parent): указан, то его локальная система координат используется.

Если ось (axis): указан, то он используется в качестве пользовательской системы координат.

Координаты трансформации как видно используем - вычисленный midPos

 */

fo.Commit () --совершаем вышеуказанную трансформацию масштабирования

max select --переключение в режим выделения

                  )

      )

Стоит отметить, что код будет работать если в нём будет просто написано

append arrV fo.getSelection #Vertex (без node:()), но будет происходить частичный сбор данных о выделенных вершинах лишь с одного из выделенных объектов под модификатором. Поэтому, если не указывать в цикле ноду (node:()) то будет происходить однобокое масштабирование к какой то одной стороне полученных вершин (можно даже понаблюдать как это будет выглядеть, если удалить код оранжевого цвета).

Именно по этому здесь дважды используется конструкция (помечена оранжевым), первый раз для сбора вершин, второй раз для получения позиции каждой вершины.

С учётом этого всё работает правильно.

_______________________________________________________________

Меняем местами значение двух переменных

Функция swap <переменная> <переменная>

a = 1

b = 2

swap a b

Format " a=% \n b=% \n" a b -- проверяем, выводим значения

Листенер:

 a=2

 b=1

OK

 

Ещё пример (работа с массивами):

a = #(1,2)

swap a[1] a[2]

a

Листенер:

#(2, 1)

_______________________________________________________________


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: