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

Содержимое удалено Содержимое добавлено
GDL
Строка 1:
[[Файл:Menger-Schwamm.png|thumb|Губка Менгера]]
'''Губка Менгера''' — геометрический [[w:фрактал|фрактал]], один из трёхмерных аналогов [[w:ковёр Серпинского|ковра Серпинского]].
 
== Построение итеративным методом на [[w:en:Geometric Description Language|GDL]] для [[w:ArchiCAD|ArchiCAD]] ==
<source lang="vbgdl">
!!!3D Script
 
GROUP "InitialCube"
AddX -0.5
AddY -0.5
AddZ -0.5
BLOCK 1, 1, 1
ENDGROUP
 
GROUP "Rods"
AddX -0.5
AddY -0.5
AddZ -0.5
FOR n = 1 TO i
MulX 1/3
MulY 1/3
AddX 1
AddY 1
FOR ny = 1 TO 3^(n-1)
FOR nx = 1 TO 3^(n-1)
BLOCK 1, 1, 1
AddX 3
NEXT nx
DEL 3^(n-1)
AddY 3
NEXT ny
DEL 3^(n-1)
AddY -1
AddX -1
NEXT n
ENDGROUP
 
GROUP "Graphite"
PLACEGROUP "Rods"
RotX 90
PLACEGROUP "Rods"
RotY -90
PLACEGROUP "Rods"
ENDGROUP
 
Menger = SUBGROUP("InitialCube", "Graphite")
 
PLACEGROUP Menger
 
KILLGROUP "InitialCube"
KILLGROUP "Rods"
KILLGROUP "Graphite"
KILLGROUP Menger
</source>
 
[[Файл:Menger4_Coupe.jpg|thumb|Губка Менгера в разрезе]]
[[w:Сечение|Сечение]] Губки Менгера плоскостью <math>x-y+z=0</math> содержит [[w:гексаграмма (символ)|гексаграммы]].
 
Для получения соответствующего [[w:Разрез|разреза]] нужно рисовать только те точки, которые лежат ниже этой плоскости: <math>x-y+z<0</math>, т.е. наложить условие при отрисовывании точек:
<source lang="gdl">
AddX -0.5 !Move Left to Let the CutPlane be Described
CUTPLANE 0.5, -0.5, 0.5
AddX 0.5 !Move Right Again
PLACEGROUP Menger
CUTEND
</source>
 
== Построение методом хаоса на [[w:Visual Basic for Applications|VBA]] для [[w:Система автоматизированного проектирования|CAD-систем]] ==
Строка 15 ⟶ 79 :
<source lang="vb">
Sub Sponge()
ThisDrawing.SetVariable "PDMODE", 0
ThisDrawing.SetVariable "PDSIZE", 1
 
Dim pointObj As AcadPoint
Строка 129 ⟶ 191 :
ZoomExtents
End Sub
</source>
 
[[Файл:Menger4_Coupe.jpg|thumb|Губка Менгера в разрезе]]
[[w:Сечение|Сечение]] Губки Менгера плоскостью <math>x-y+z=0</math> содержит [[w:гексаграмма (символ)|гексаграммы]].
 
Для получения соответствующего [[w:Разрез|разреза]] нужно рисовать только те точки, которые лежат ниже этой плоскости: <math>x-y+z<0</math>, т.е. наложить условие при отрисовывании точек:
<source lang="vb">
If location(0) - location(1) + location(2) < 0 Then
Set pointObj = ThisDrawing.ModelSpace.AddPoint(location)
End If
</source>