Schätzen der Fläche eines Dreieck-Kreis-Schnittpunkts


7

Ich versuche, Ray Tracing mit Zapfen zu implementieren (Amanatides 1984) . Anstelle von Strahlen werden Kegel in die Szene geschossen und mit Geometrie geschnitten. Da mehrere Dreiecke die Apertur des Kegels einnehmen können, müssen wir die relative Fläche des Kreises, der vom Dreieck bedeckt wird, berechnen (oder ziemlich schnell schätzen, da die Kegelverfolgung ohnehin viele Annäherungen macht). Anschließend werden die einzelnen Beiträge gewichtet und zusammengefasst.

Der Autor gibt leider nicht viele Details über seine Lösung. Folgendes schreibt er über Kegel-Ebenen-Schnittpunkte:

Der Ausbreitungswinkel und der Winkel zwischen dem Strahl und der Ebene, die oben zusammen berechnet wurden, geben an, wie der Abstand zwischen dem Mittelpunkt des Kreises und der Kante der Halbebene ist. Bei dieser Entfernung wird die Schnittfläche unter Verwendung einer Polynomnäherung berechnet. Damit ist die Schnittpunktberechnung für Ebenen abgeschlossen.

Und dann, nachdem ein Polygon auf die Ebene senkrecht zum Richtungsvektor des Kegels projiziert wurde:

Wir müssen dann den Schnittpunkt zwischen dem projizierten Polygon und einem Kreis berechnen. Dies kann erreicht werden, indem der Abstand vom Mittelpunkt des Kreises zu jeder der Kanten berechnet und dann die zuvor erwähnte Schätzung des Schnittpunkts zwischen Kreis und Halbebene verwendet wird.

Ich habe bei StackExchange eine Lösung für das Problem gefunden . Ich habe den Code aus der Antwort von NowIGetToLearnWhatAHeadIs portiert , und er funktioniert einwandfrei , scheint mir aber ziemlich kompliziert zu sein. Ich arbeite mit Compute Shadern, daher ist das Verzweigen eine schlechte Sache, und die Lösungen hängen stark davon ab.

  1. Was ist das Polynomannäherungseinheit dass Amanatides spricht über, und wie wird es auf Polygone angewendet werden (ESSA. Dreiecke)?
  2. Gibt es eine Annäherung an das Problem, die vernünftig genaue Ergebnisse (z. B. ± 10%) bei erheblichen Verbesserungen der Leistung / Code-Einfachheit liefert?
  3. Bei der Arbeit mit GPUs interessiere ich mich für eine optimierte Lösung, die beispielsweise Min / Max über Verzweigung verwendet. Vielleicht gibt es so etwas schon. Etwas Glück?

1
Sie haben keinen Zweifel , lesen diese bereits? Wären Sie offen für ein Montecarlo von beispielsweise 16 Proben?
Joojaa

Antworten:


4

Auf dem Weg zu einer exakten Lösung

Nur ein kurzer Gedanke, bevor ich rennen muss!

Ok, lassen Sie uns das Problem auf den Kopf stellen. Was ist, wenn man die vom Kreis geschnittene Fläche des Dreiecks nicht berechnet? Berechnen wir stattdessen die Umkehrung davon. Die Fläche von drei Segmenten wird aus dem Kreis herausgeschnitten. Das Schöne an diesem Ansatz ist, dass wir einen einzelnen Code erstellen können, den wir dreimal wiederholen können. Natürlich wird die Antwort manchmal 0 sein, aber das ist in Ordnung.

Geben Sie hier die Bildbeschreibung ein

Bild 1 : Berechnen wir stattdessen dieses Problem.

Nun stellt sich heraus, dass wir wissen, wie man die Umkehrung berechnet, es ist das Segment eines Kreises. Wir können also einfach sagen, dass .EINichnt=EINcichrcle- -EIN1- -EIN2- -EIN3

Geben Sie hier die Bildbeschreibung ein

Bild 2 : Wir kennen diese Lösung.

Die Formel für die Fläche eines Segments lautet einfach und das hat in der Literatur eine bekannte Lösung.EINsectÖr- -EINtricheinnGle

Jetzt müssen Sie nur noch die Schnittpunkte zwischen den Kanten und dem Kreis in einem auf dem Kreis zentrierten Raum finden, den Winkel zwischen diesen berechnen und dann jedes Segment berechnen. Und der einzige Sonderfall ist, wenn keine Kreuzung existiert. Ich weiß nicht, ob dies schnell ist, aber zumindest sollte Code etwas einfach zu implementieren sein.


Ich wette, die Größe der Bogengröße kann mit dem nächsten Punkt auf der Linie berechnet werden, der dies sehr ordentlich machen würde.
Joojaa

Ich liebe die Eleganz dieses Ansatzes. Benötigt es einen speziellen Fallansatz, wenn sich einer der Eckpunkte innerhalb des Dreiecks befindet? Es sieht so aus, als könnte das einen Teil des Gebiets zweimal zählen.
Trichoplax

@joojaa Dies kann tatsächlich mit der Sagitta berechnet werden, und es gibt sogar eine ungefähre Formel dafür (Harris und Stocker 1998). Siehe mathworld.wolfram.com/CircularSegment.html
David Kuri

@trichoplax In der Tat würde diese Methode fehlschlagen, wenn sich mindestens ein Scheitelpunkt innerhalb des Kreises befindet, und ich kann nicht garantieren, dass dies nicht der Fall ist. Immer noch auf der Suche nach einer guten Lösung ...
David Kuri
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.