Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 20, 2025 01:24

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 20:49 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
dj3hut1 hat geschrieben:
Hallo NerdIII,

eine sehr einfaches Verfahren zur Berechnung einer Bounding Sphere findest du hier : http://wiki.delphigl.com/index.php/Bounding_Sphere.
Es reicht aus die Bounding Box deines Objektes zu berechnen und den Mittelpunkt als Mittelpunkt der Bounding Sphere zu verwenden (mit der halben Raumdiagonalen als Radius).

Ich denke, dass es für eine Echtzeitandwendung wie z.B. einem Editor nicht unbedingt nötig ist, eine absolut perfekte Bounding Sphere zu berechnen, um einen "Klickradius" zu bestimmen, sondern dass es eher darauf ankommt, eine gute Näherungslösung in effizienter Zeit zu berechnen.

Viele Grüße
dj3hut1

Stimmt, das ist vermutlich besser, als die Methode von Seth die ich momentan für den 'lazy mode' verwende.
Ich bin aber von meinem eigentlichen Problem mal absichtlich abgekommen, weil ich es interessant fand einen exakten Algorithmus zu schreiben.

oc2k1 hat geschrieben:
Nun um die Beste Boundingsphere zu finden sollte man etwa so vorgehen (Denk ich zumindest):

Als erstes werden die 2 Punkte gesucht, die am weitesten von einander entfernt sind. Diese liegen auf der Kugeloberfläche (zumindest kann ich mir nicht vorstellen wie ich pukte so verteilen kann das die mit dem größtem Abstand nicht auf dem kleinstmöglichen Kreis oder Kugel befinden.)

Habe ich auch zuerst gedacht, aber Fehlanzeige: (Bild 1)
Die am weitesten von einander entfernten Punkte sind in diesem Beispiel nicht auf der Umkugel! Die Grauzone zeigt, wo sich Punkte verstecken können, die eine kleinere Entfernung besitzen (innerhalb beider großer Kreise) und trotzdem außerhalb der Kugel zwischen beiden Punkten.

oc2k1 hat geschrieben:
Nun müssen alle Punkte verworfen werden, die innerhalb der kleinstmöglichen Kugel zu finden sind. Von dene die überbleiden wird der mit dem gößtem Abstand zu den bekannten gesucht. Mit diesn 3 Punkten wird eine neue Sphere erzeugt (Kleinste Kugel aus 3 Punkten. Die Sphere kann dabei nur in eine richtung verößert werden, da sonst zwei treffer in diesem durchgang einengrößeren abstand hätten als im erstem durchgang)

Da nun zwar 3 Punkte bekannt sind, bleiben nurn noch ein freiheisgrad zu viel: Wieder wird aus der Punkt ausgesucht der von allen andern am weitesten entfernt ist. DIeser ist dann der 4. un d letzte Punkt reicht aus um eine enin deutige Sphere zu konstruieren, Allderding kann es beim 3. oder 4. Punkt passieren dass keiner mehr außerhalb der aktuellen sphere zu finden ist, dann kann der algoritmus früher abgebrochen werden....

Nicht schlecht vom Gedanken her, aber als ich das probiert habe ist folgendes passiert: Wärend ich die Kugel in die eine Richtung ausgeweitet habe um einen dritten Punkt aufzunehmen, ist sie auf der gegenüberliegenden Seite abgeflacht und dadurch ein Punkt, der bereits ok war wieder rausgefallen!
(Bild 2)

Lyr hat geschrieben:
Soweit ich das damals mit bekommen habe ging es bei dem Algorithmus den ich verwendet habe etwa so:
Nimm 2 zufällig ausgewählte Punkte und mach die minimale Bounding Sphere.
Hol einen 3ten Punkt herein (den du noch nicht betrachtet hast), schau ob er innerhalb oder ausserhalb der Kugel liegt.
Ausserhalb => Verwende den 3ten Punkt ebenfalls als Stützpunkt
Innerhalb => nächster Punkt

Teilweise kommt man dann (wie NerdIII bereits gesagt hat) auf bis zu 4 Stützpunkte. Wenn du alle Punkte durchlaufen hast, dann hast du höchst wahrscheinlich bereits eine sehr gut angenäherte Sphere. Danach zur Sicherheit noch mal alle Punkte überprüfen wenn mans genau wissen will und das war.

Um mit absoluter Sicherheit die minimale Bounding Sphere zu erhalten bedarf es aber wohl einen O(n^4) Algorithmus. Also der obere Algorithmus kann denke ich (nicht getestet) schon mal versagen wenn die Punkte halbwegs so wie die Oberfläche einer Kugel verteilt sind (mit kleinen Abweichungen). In diesem Fall rennt der obere Algorithmus entweder ziemlich lange wenn mans genau wissen will, oder aber man vergleicht wirklich jedes 4er Pärchen von Punkten (=> n^4). Ein anderer sehr unguter Fall für den oberen Algorithmus ist, wenn alle Vertices schön auf einem Haufen sind und nur 1 oder wenige extreme Ausreisser dabei sind ... das hab ich damals einige male am eigenen Leib zu spüren bekommen.

Dein Algorithmus würde auch zu dem Beispiel im zweiten Bild führen. Den Brute-Force-Algorithmus habe ich auch implementiert und ich muss sagen, n^4 macht keinen - wirklich garkeinen - Spass. ...Aber er lief völlig bugfrei ^^.
Ich kann dir aber versichern, dass O(n^4) nicht das Minimum ist. Ich bin kein Mathematiker, aber O(n^2) geht 100% weil ich in meinem Algorithmus nur 2 Schleifen verwende.

oc2k1 hat geschrieben:
Wenn man 4 Punkte auf einer Kugeloberfläche gefunden hat und alle anderen drin sind, gibt es keine kleinere Kugel mehr.
Das Wichtigste wäre bei einem algoritmuss alle Punkte ausscheiden zu lassen, die garnatiert nicht auch der Oberfläche liegen. Denkbar wäre ein algoritmus der zuerst den Schwerpunkt berechnet und anschließend von innen heraus so viele Punkte wie möglich eleminiert. Hier wird nur O(2n) verbraucht. Auf jedenfall ist der Punkt, der am weitesten vom Schwerpunkt entfernt ist ein. Sehr guter Kandidat für einen Stützpunkt (eventuell könnte man beweisen, das er ein Stützpunkt ist), hat man diesen ersten punkt kann man nach dem zweiten suchen, dies kostet ebenfalls nur O(2n) für den 3. und 4 müsste man ebenfalls so handeln, so das der such aufwand nur proportional zu der anzahl der Punkte steigt. Prinzipell lässt sich das wieder an einem anderem algorimus zeigen:

alle Punkte werden wahlos in 4er gruppen aufgeteilt, welche eine Sphere erzeugen, nun werden immer Speheren durch eine gemeinsame Boundingsphere ersetzt (für 8 Punte ist der aufwand ja konstant, die 4 eingeschlossenen Punkte werden dabei verworfen) mit jedem Durchlauf halbiert sich die Anzahl der Spheren, so das der aufwand wohl mit O(log(n)) angegeben werden muss, was meiner Ansicht nach fast so gut wie O(n) ist.

Gegenbeweis:
(Bild 3)

Lyr hat geschrieben:
[...]Natürlich zielt ein Algoirthmus der die optimale minimale Bounding Sphere finden möchte erst mal darauf ab möglichst viele Vertices zu eliminieren. Warum tut er das? Weil es im durchschnittlichen Fall einfacher ist weniger Punkte prüfen zu müssen als mehr. Wenn man aber mit wenigen Punkten (zB 4) recht einfache Beispiele geben kann, wo man mit einem gegebenen Algorithmus alle Punkte mit allen vergleichen muss, so liegt die Annahme nicht allzu fern, dass es auch mit mehr Punkten Beispiele gibt wo der Aufwand enstprechend groß ist.

Ich will nicht behaupten, dass der Aufwand wirklich O(n^4) ist, weil ich mich diesbezüglich zu wenig auskenne. Aber bevor ich etwas anderes glaube muss mir jemand das Gegenteil beweisen.

Aus meinen vorigen Annahmen folgt auch mein obiges Beispiel wo alle Punkte annähernd auf einer Kugel liegen, ansonnsten sind meine Annahmen beispielsweise durch Punkt-Ausschluss-Algorithmen wie du einen genannt hast zu wiederlegen.

Unwichtige Punkte im Vorhinein zu eliminieren wird sehr unwichtig, wenn man sich O(n) nähert und nur vier Punkte bestimmen muss. 8) Das beste was ich dazu hatte war Punkte zu löschen, die innerhalb des Tetraeders lagen, dass ich aus meinen bisher gefundenen 4 Punkten aufgespannt habe. Und das war im Brute-Force-Algorithmus, also hilfreich aber nur ein Tropfen auf den heißen Stein.
Was O(n^4) angeht kann ich nur wieder sagen: Ich habe nur zwei Schleifen in einem Algorithmus der das Problem lößt!
Jetzt könnten die Grafiken oben natürlich gefaked sein. Sind sie aber nicht.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 29, 2006 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Zu Bild 1: die Zwei Punkte die vom innerem Kreis berüher werden, sind nicht die die am weitesten von einander entfernt sind: Es wäre der untere und einer von den beiden oberen. Der 2. oberen Punkte würden dann spätestens beide beim Suchen nach dem 3. Punkt erkant werden.

zu Bild 3: Die neue Boundingsphere muss alle Vertices umschließen.

Der Schlechteste brutforce Algoritmus müsste so ungefähr auf O(!n /!(n-4)) kommen. Bei 49 Vertices entsricht das der Warscheinlichkeit von 4 Richtigen im mit den ersten 4 gezogenen Zahlen im Lotto...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 29, 2006 14:56 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Wie ich das sehe, ist der schwierigste Teil, den Mittelpunkt der Umkugel zu finden. mein Vorschlag hierzu wäre: Reduziere das Problem auf ein kleineres und löse dieses.
Im konkreten Fall: Bilde 4er Gruppen und berechne deren Mittelpunkt (ist rel. einfach: Mittelpunkt eines unregelmäßigen Tetraeders). Hast Du eine Anzahl <>n*4 werden die verbliebenen Punkte ähnlich behandelt: bei 3 Mittelpunkt eines Dreiecks, bei 2 linie, bei 1 isses klar.
Das wiederholst Du für die erhaltenen Mittelpunkte solange, bis Du einen Punkt übrig hast. Dieser sollte dem Mittelpunkt der Umkugel doch ziemlich nahe kommen.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 29, 2006 23:02 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
@oc2k1: Bild 1 - Nein, die oberen Punkte sind nicht weiter weg. Die Bemaßung ist am falschen Punkt! Eigentlich wollte ich zum einem der oberen Punkte verbinden, um zu zeigen, dass die entfernung < 140 mm ist.
Bild 3 - Ja, aber woher soll ich beim Ausweiten der Kugel wissen, dass jetzt irgendwo in der Mitte ein Punkt rausfällt? Der rote Punkt wird ja 'urplötzlich' zu einem Punkt auf der Hülle.

@Sidorion: Divide&Conquer? Immer gerne, aber wie du schon sagtest, das ist eine Näherungslösung und da gefällt mir die von dj3hut1 doch besser, weil einfacher ^^.

Mein Algorithmus braucht immer einen Ausgangpunkt. Dafür verwende ich den Punkt, der am weitesten vom Ursprung weg liegt. Also der bei dem Sqrt(x²+y²+z²) am größten ist. Ein solcher Punkt liegt auf jeden Fall 'außen' muss aber nicht zu den Punkten gehören, die die Bounding-Sphere bilden. Daher wird er später eventuell ausgetauscht.
An diesem 1. Punkt mache ich die Hülle der Umkugel fest und lasst selbige in Richtung (0,0,0) ausdehnen. Die Umkugel wird dann solange verkleinert, bis sie auf einen Punkt trifft -> Punkt 2. (Der Algorithmus bestimmt den Punkt über eine Formel mit den Koordinaten jedes Punktes. Eine Rechung pro Punkt.)
Punkt 1 und 2 haben die gleiche Entfernung zum vorläufigen Mittelpunkt. Diese stellt den vorläufigen Radius dar.
Nun wird die Umkugel an den 2 Punkten fixiert und in ihre Richtung reduziert. Sobalt die Umkugel anstößt habe ich Punkt 3 usw.
Im ungünstigen Fall kann es passieren, dass die Umkugel durch einen neuen Fund von 1 oder 2 der vorherigen Umkugel-Punkte 'abhebt'. Diese werden dann gelöscht und die Suche muss wieder eine Stufe tiefer weiter machen. (Das ist die zweite Schleife, die im ungünstigsten Fall - alle Punkte AUF der Umkugel - für n²-Laufzeit sorgt.)
Sobald ich 4 Punkte gefunden habe (oder weniger zur Bestimmung der Umkugel gereicht haben) wird der Algorithmus beendet. Die gefundenen Punkte bilden die Umkugel.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]