Du bist nicht angemeldet.

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 375

Wohnort: Bayern

  • Private Nachricht senden

1

14.09.2015, 12:46

Kugel Generator Algorithmus

Hi,
eine Kugel ist ja ein drei Dimensionales Objekt, das z.B. so in 2d Abgebildet werden kann:

(Link)


Zum Generieren von Punktgittern solcher drei dimensionalen Kugeln gibt es sicher Algorithmen, da man diese in beliebiger Detailstufe beispielsweise in Cinema 4d generieren kann.

Ich benötige aber die Punkte einer Halbkugel (also ohne die nicht sichtbare Kugelrückseite) innerhalb einer Ebene, wie wenn man auf dem Bild oben bei jedem Schnittpunkt sich einen Punkt einzeichnen würde.
Gibt es dafür auch einen Algorithmus, am besten für unterschiedliche Detailstufen?

Schönen Gruß,
MitgliedXYZ

Schorsch

Supermoderator

Beiträge: 5 205

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

2

14.09.2015, 12:57

Einen bestimmten Algorithmus kenne ich spontan nicht. Vielleicht mal bei Blender rein gucken wie es da gelöst ist. Ansonsten würde ich das spontan einfach selbst zusammen fuckeln. Ich würde mir im Weltursprung eine Kugel generieren wobei ich einfach die Formel für Kugeln nehmen würde und mir darüber meine gewünschten Punkte berechnen würde. Die Detailstufe kannst du dir dabei dann ja aussuchen. In deinem Fall würdest du eben nur eine halbe Kugel berechnen. Am Ende transformierst du die Kugel passend und fertig.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 375

Wohnort: Bayern

  • Private Nachricht senden

3

14.09.2015, 13:54

Wenn du es so sagst klingt es einfach, mal schauen ob ich es so auch umsetzen kann :huh:

Also die Gitterpunkte in einem drei dimensionalen System könnte ich berechnen. Das Weglassen der Rückseite ist auch kein Problem. Wie ich denn nächsten Schritt dann richtig umsetze rätsle ich aber noch.

Ein Beispiel:

Um den Ursprung des KOSY werden mit Radius 1LE z.b. 100 Punkte in gleichem Abstand zueinander generiert. Dann denke ich mir eine Ebene die z.B. 2LE von dem Ursprung in z Richtung Entfernt ist. Jetzt Bewege ich alle Punkte entlang der z Achse, bis sie in der gedachten Ebene liegen und habe mein 2d Kugel-Abbild.

Kann das so funktionieren, oder übersehe ich da was?

4

14.09.2015, 14:12

Das funktioniert so. Über Abstand Punkt-Ebene bekommst du ja auch alle nötigen Informationen für jeden Punkt, um sie dort abzubilden.
Außer ich verstehe irgendwas falsch. :) Aber letztlich willst du auf einer Ebene die Punkte der Halbkugel haben, sprich den Schatten eines jeden Punktes der entsprechenden Halbkugel auf dieser Ebene, nicht?

MfG
Check

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 375

Wohnort: Bayern

  • Private Nachricht senden

5

14.09.2015, 14:27

Ich weiß nicht ob ich dich richtig verstehe, was du mit "Schatten" meinst.
Also ich hätte gerne am Ende die Punkte, die beispielsweise auf dem Bild oben bei den Schnittpunkten der Linine entstehen würden.
Wenn es funktioniert sollten also innen die einzelnen Punkte weiter auseinander liegen als außen (da die inneren Punkte ja das Gefühl vermitteln sollen näher am Betrachter zu liegen).

Ich werde es einfach mal testen, dann sehe ich schon, ob es so funktioniert wie ich mir das vorstelle.

6

14.09.2015, 14:52

Korrekter wäre wohl 'Projektion', entschuldige. Meine Lehrerin meinte immer, wir sollen so tun, als würde das Objekt angestrahlt werden, sodass es dann auf der Ebene einen Schatten wirft. ^^

MfG
Check

7

14.09.2015, 20:09

Ist eigentlich recht einfach, nur ein wenig Trigonometrie.
In Pseudocode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Point[] GenSphere(float radius, int numSlices, int numStacks) {
    Point[] points;
    points.add(0, radius, 0); // North pole
    for (int i = 1; i < numStacks; i++) {
        float theta = i * PI / numStacks;
        for (int k = 0; k < numSlices; k++) {
            float phi = 2 * k * PI / numSlices;
            points.add(
                cos(phi) * sin(theta) * radius,
                cos(theta) * radius,
                sin(phi) * sin(theta) * radius);
        }
    }
    points.add(0, -radius, 0); // South pole
    return points;
}

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 375

Wohnort: Bayern

  • Private Nachricht senden

8

14.09.2015, 20:17

@Batzer
Seit wann bekommt man den hier direkt seinen Code zugeworfen :D
Danke, ich werde das dann morgen auch mal testen.

9

14.09.2015, 21:20

Von mir immer :D Finde es persönlich einfacher sowas als Code auszudrücken bzw zu verstehen.

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

10

15.09.2015, 07:51

Ein recht einfacher und guter Algorithmus ist: Man starte mit einem Ikosaeder und unterteile dann jedes Dreieck rekursiv in gleich große, kleinere Dreiecke und verschiebe die neuen Vertices soweit nach außen, dass sie wieder auf der Kugel liegen. Das Ganze so lange bis die Dreiecke klein genug für die gewünschte Qualität sind (so erzeugte Kugeln werden oft als "Geosphere" bezeichnet). Vorteil dieser Methode ist, dass sich nach dieser Methode eine wesentlich gleichmäßigere Tessellierung als mit der Unterteilung in Kugelkoordinaten ergibt.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (15.09.2015, 07:59)


Werbeanzeige