Сортировка массива пузырьком 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Сортировка массива пузырьком



a=#(2,5,1,8,4,5,7)
for i=a.count to 1 by -1 do
for j=1 to a.count while j<i do
if (a[j] > a[j+1]) do
(
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
)
a
Но этот метод сортировки очень медленно работает!
В десятки раз быстрее работает
 
arr = for i = 1 to 10 collect
(
id_1 = random 1 100
id_2 = random 1 100
p3 = random [-100,-100,-100] [100,100,100]
#(id_1, id_2, p3)
)
 
fn compareFN v1 v2 pos: =
(
local d = (distance v1[3] pos) - (distance v2[3] pos)
case of
(
(d<0.): -1
(d>0.): 1
default: 0
)
)
qsort arr compareFN pos:[100,0,0]

Примерно это же описано в справке maxscript

_______________________________________________________________

Пример фильтра нескольких объектов по признаку.

findItem (for i=1 to selection.count collect superClassOf selection[i] == shape) false == 0

-- За скобками: найти значение false в массиве, который получится циклом в скобках, сравнить результат поиска с нулём (то есть значение false ищем и не находим если результат поиска есть ноль.), тем самым удостоверяемся что внутри все значения true и проверку все прошли.
Теперь что происходит в скобках: Для каждого элемента i начиная с первого до числа выделенных объектов собрать в массив результаты сравнений каждого элемента по признаку суперкласса, который есть или не есть шэйп. Результатами сравнений получаются как раз булевые значения true/false, которые потом ищем файндитемом.

_______________________________________________________________

Передаём функции переменную

fn createSphere rad wc: (color 0 0 0) = (
Sphere radius:rad wirecolor:wc
)
createSphere 40
createSphere 40 wc: (color 0 200 200)
/*Здесь надо обратить внимание на параметр wc, передаваемый функции в строке объявления функции.*/

_______________________________________________________________

Битовые массивы. Применение множеств

Разница между массивом и битовым массивом:

Просто массив Array может в себя вмещать любые типы данных и в любом сочетании
А битовые bitArray массивы могут быть заполнены только целыми числами. Представляют из себя некие математические множества, с которыми можно производить математические операции.

 

A+B = логическое OR (или)

Для битовых массивов Maxscript это значит:

A=#{1,2,3,4}

B=#{5,6,7,4}

A+B

Листенер вернёт #{1.. 7}

 

_________________________________

Разность множеств

Для битовых массивов Maxscript это значит:

A=#{1,2,3,4}

B=#{5,6,7,4}

A-B

Листенер вернёт #{1..3}

B-A

Листенер вернёт #{5..7}

_________________________________

 

A*B = логическое AND (и)

A=#{1,2,3,4}

B=#{5,6,7,4}

A*B

Листенер вернёт #{4}

 

Для обычного массива количество элементов - это свойство.count, а для

битового массива количество элементов - свойство.numberset

_________________________________

Пример:

Выделение новых полигонов созданных после экструда:

a = #{1..(PolyOp.GetNumFaces $)}
-- Делаем вручную экструд
b = #{1..(PolyOp.GetNumFaces $)}
PolyOp.SetFaceSelection $ (b - a)

 

Подобные вещи можно делать не только с экструдом, но и с другими инструментами.

А также выделять не только полигоны, но и рёбра и вершины.

_______________________________________________________________

В битовом массиве проверка наличия элемента вместо finditem

Vs=#{23, 100, 3}

Vs[22]

false

Vs[100]

true

_______________________________________________________________

Получение открытых вершн

То есть таких вершин, которые находятся на краю по контуру

Метод для 2010 макса и выше

OpenE=#()
openEdges.Check currentTime selection[1] &OpenE
OpenVert=for e in OpenE collect selection[1].GetEdgeVertex e 1
OpenVert

Получение открытых рёбер

meshop.getOpenEdges <Mesh mesh>

polyop.getOpenEdges <Poly poly>

--------------------------------------------------------------

OpenE=#()

openEdges.Check currentTime selection[1] &OpenE

 

_______________________________________________________________



Поделиться:


Последнее изменение этой страницы: 2021-04-13; просмотров: 50; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.63.136 (0.005 с.)