Zylindererzeugung in abgeschlossenem Volumen
Verfasst: Freitag 20. Februar 2009, 11:24
Hallo,
ich habe die Absicht in einem Würfel eine variable Anzahl an langen zufällig, orientierten Zylindern, durchdringungsfrei zu positionieren. Die Vorgehensweise, die ich bis jetzt verwende sieht wie folgt aus:
1. Startpunkt des Zylinders mithilfe eines Zufallsgenerators erzeugen, dabei muss der Abstand zu alle anderen Punkten gegen ein Kriterium geprüft werden.
2. Danach wird ein (bezüglich der x-Achse eines kartesichen Koordinatensystems paralleler) Vektor erzeugt, dessen Richtung durch zwei Rotationen (zufällig generierte Winkel in bestimmten Bereichen) verändert wird.
3. Durch Multiplikation dieses Einheitsvektors mit der Länge des Zylinders wird ein Geradenabschnitt erzeugt.
4. Jetzt wird dieser geradenabschnitt gegen alle vorliegenden Geraden auf Durchdringung gecheckt. Gegebenenfalls wird eine neue Gerade auf diese Weise per Zufall erzeugt.
Das funktioniert auch recht gut und ausreichend schnell bis ca 10vol% . Das Problem ist nur, dass ich den Volumenanteil der Zylinder bis knapp unter 20% haben möchte. Dann dauert die Rechnung natürlich sehr lang (14-vol% dauern auf meinem AMD xp 1800 ca. 5 Stunden), was durch die Herangehensweise bestimmt ist.
Was ich mir jetzt davon erhoffe, dass ich den Code hier online stelle:
Vielleicht kann jemand drüber schauen und mir Verbesserungsvorschläge liefern, die in erster Linie die Geschwindigkeit verbessern sollen.
Vielleicht sieht jemand noch eine weitere Lösungsmöglichkeit, um mein Vorhaben zu lösen.
Vielen Dank an alle, die sich die Mühe machen.
http://paste.pocoo.org/show/104661/
Edit: Habe den Code ausgelagert
ich habe die Absicht in einem Würfel eine variable Anzahl an langen zufällig, orientierten Zylindern, durchdringungsfrei zu positionieren. Die Vorgehensweise, die ich bis jetzt verwende sieht wie folgt aus:
1. Startpunkt des Zylinders mithilfe eines Zufallsgenerators erzeugen, dabei muss der Abstand zu alle anderen Punkten gegen ein Kriterium geprüft werden.
2. Danach wird ein (bezüglich der x-Achse eines kartesichen Koordinatensystems paralleler) Vektor erzeugt, dessen Richtung durch zwei Rotationen (zufällig generierte Winkel in bestimmten Bereichen) verändert wird.
3. Durch Multiplikation dieses Einheitsvektors mit der Länge des Zylinders wird ein Geradenabschnitt erzeugt.
4. Jetzt wird dieser geradenabschnitt gegen alle vorliegenden Geraden auf Durchdringung gecheckt. Gegebenenfalls wird eine neue Gerade auf diese Weise per Zufall erzeugt.
Das funktioniert auch recht gut und ausreichend schnell bis ca 10vol% . Das Problem ist nur, dass ich den Volumenanteil der Zylinder bis knapp unter 20% haben möchte. Dann dauert die Rechnung natürlich sehr lang (14-vol% dauern auf meinem AMD xp 1800 ca. 5 Stunden), was durch die Herangehensweise bestimmt ist.
Was ich mir jetzt davon erhoffe, dass ich den Code hier online stelle:
Vielleicht kann jemand drüber schauen und mir Verbesserungsvorschläge liefern, die in erster Linie die Geschwindigkeit verbessern sollen.
Vielleicht sieht jemand noch eine weitere Lösungsmöglichkeit, um mein Vorhaben zu lösen.
Vielen Dank an alle, die sich die Mühe machen.
http://paste.pocoo.org/show/104661/
Edit: Habe den Code ausgelagert