Durch den optimierten Code gibt es keine mehrfach besetzten Felder mehr und die Struktur generiert sich frei im Raum.

 

Verändert man die Variable 'num' - hier auf den Wert 3 gesetzt, verschiebt das System seine 3 dimensionale Rasterung.

weiter >


Sub setzeQuad(mittelPunkt() As Double, elevation As Double)
' Dim num As Integer num = 4
Dim wuerfel As Acad3DSolid
Dim length As Double, width As Double, height As Double
Dim center(0 To 2) As Double

' Angaben für den wuerfel
center(0) = mittelPunkt(0): center(1) = mittelPunkt(1): center(2) = mittelPunkt(2) - elevation / 2
height = elevation
length = 10
width = 10

' Würfel erstellen
Set wuerfel = ThisDrawing.ModelSpace.AddBox(center, length, width, height)
wuerfel.color = random(0, 255)
End Sub

Sub main()
Dim i As Integer, u As Integer, loops As Integer, entscheid As Integer
Dim etage As Double, oneSlice As Double, angle As Double, xW As Double, yW As Double, num As Double
Dim mitte(0 To 2) As Double
loops = 400
Dim checkList(0 To 400) As Variant
Dim check As Boolean, break As Boolean
num = 4
oneSlice = pi * 2 / num
checkList(0) = mitte
checkList(0)(0) = 1#
etage = u
xW = 0
yW = 0
u = 0

For i = 1 To loops
check = True

For u = 0 To i - 1
' Würfelposition wird anhand des checkList-Arrays auf Doppelbelegung überprüft
If mitte(0) = checkList(u)(0) And mitte(1) = checkList(u)(1) And mitte(2) = checkList(u)(2) Then
' Wenn Position bereits besetzt, verschiebung nach oben oder unten
etage = etage + random(-1, 1) * 10#
check = False
End If
Next u

' Wenn keine Doppelbelegung
If check Then
'Richtung des nächsten Würfels berechnen
angle = Round((Rnd() * num + 1)) * oneSlice
mitte(0) = xW: mitte(1) = yW: mitte(2) = etage

' mitte an checklist-Array übergeben
checkList(i) = mitte

' Koordinaten berechnen und Würfel zeichnen
xW = Round(xW + Cos(angle) * 11, 0)
yW = Round(yW + Sin(angle) * 11, 0)
setzeQuad mitte, 10#

' mitte-Array aktualisieren für Positionskontrolle
mitte(0) = xW: mitte(1) = yW: mitte(2) = etage

Else ' Bei Doppelbelegung wird lediglich die Höhe verändert und die checkList erweitert, damit die Laufvariable nicht auf ein unbesetztes Array-Feld verweist
mitte(2) = etage
checkList(i) = checkList(i - 1)

End If

Next i

ZoomAll
End Sub


Function random(lower As Double, upper As Double)
random = Int((upper - lower + 1) * Rnd + lower)
End Function

Function pi()
pi = (Atn(1) * 4)
End Function



 
 
 
\\ Entwurfsforschung \ Strukturexperimente \ autoCAD_VBA experimente