Реализации алгоритмов/Губка Менгера: различия между версиями

Содержимое удалено Содержимое добавлено
м уточнение
м оформление
Строка 6:
Алгоритм итеративного метода основан на операции твердотельного вычитания (subtraction). В языке GDL такая операция реализуется с помощью групп (group).
 
# Строится группа-"уменьшаемое". Она состоит из одного единичного куба (стороной 1 си центромодной из вершин в начале координат).
# Строится группа-"вычитаемое". Она включает фронтальные, горизонтальные и профильные "стержни", которые будут вычитаться из куба. Размер и количество зависит от итерации.
# Проводится операция твердотельного вычитания.
 
Данный метод весьма требователен к ресурсам:
{| class="standard"
|-
!Итерация||1||2||3||4||5
|-
|Стержней одного направления||1||9||81||729||6561
|-
|Стержней всего||3||27||243||2187||19683
|-
|Сторона основания стержня||1/3||1/9||1/27||1/81||1/243
|-
|Вершин|| || || || ||
|-
|Треугольников|| || || || ||
|-
|Рёбер|| || || || ||
|}
 
Код оптимизирован под наглядность, а не производительность. В среде ArchiCAD 19 и 20 корректно исполняются 4 итерации. В среде ArchiCAD 13 (64 бит) корректно исполняются только 2 итерации.
Строка 14 ⟶ 32 :
<source lang="gdl">
!!!3D Script
 
MulX A
MulY B
MulZ ZZYZX
 
GROUP "InitialCube"
AddX -0.5
AddY -0.5
AddZ -0.5
BLOCK 1, 1, 1
ENDGROUP
 
GROUP "Rods"
FOR n = 1 TO i
AddX -0.5
AddY -0.5
AddZ -0.5
FOR n = 1 TO i !i - количество итераций. Задаётся в разделе "Parameters Script"
MulX 1/3
MulY 1/3
Строка 48 ⟶ 64 :
PLACEGROUP "Rods"
RotX 90
AddZ -0.51
PLACEGROUP "Rods"
RotYDEL -902
RotY 90
AddX -0.51
PLACEGROUP "Rods"
ENDGROUP
Строка 55 ⟶ 74 :
Menger = SUBGROUP("InitialCube", "Graphite")
 
IF CutOut THEN
PLACEGROUP Menger
CUTPLANE 1.5, 1.5, 1.5
PLACEGROUP Menger
CUTEND
ELSE
PLACEGROUP Menger
ENDIF
 
KILLGROUP "InitialCube"
Строка 66 ⟶ 91 :
[[w:Сечение|Сечение]] Губки Менгера плоскостью <math>x+y+z=0</math> содержит [[w:гексаграмма (символ)|гексаграммы]].
 
Для получения соответствующего [[w:Разрез|разреза]] нужно рисовать только тету точкичасть, которыекоторая лежатрасположена ниже этой плоскости: <math>x+y+z<0</math>, т.е. наложить условие при отрисовывании точек:
<source lang="gdl">
CUTPLANE 1.5, 1.5, 1.5
AddX -1 !Move Left to Let the CutPlane be Described
CUTPLANE 1, 1, 1
AddX 1 !Move Right Again
PLACEGROUP Menger
CUTEND
Строка 106 ⟶ 129 :
|}
 
Код оптимизирован под наглядность, а не производительность. В среде ArchiCAD 13, 19 и 20 корректно исполняются 4 итерации. Оптимальны для работы 3 итерации.
 
Для визуализации вместо старших итераций можно использовать текстуру [[w:Ковёр Серпиского|ковра Серпинского]]
 
<source lang="gdl">
!!!3D Script
 
MulX A/(3^i)
MulY B/(3^i)
MulZ ZZYZX/(3^i)
 
GOSUB i