Leverator hat geschrieben:also nachdem ich eine Nacht drüber geschlafen habe, muss ich zugeben, dass ich nicht ganz zufrieden bin mit der Lösung.
Es gibt keine zufriedenstellende Lösung, wenn Du an die Grenzen der Genauigkeit von Fließkommazahlen kommst. ^^
Grundsätzlich kann man die Lösung, die Du vorher genannt hast, als die Lösung ansehen, die implementiert wurde: Der Würfel wurde in 12 Kanten zerlegt, die einen Anfang und ein Ende haben. Die Flächen wurden in 6 Loops zerlegt, die je nach Drehsinn den Index auf die Kante besitzen: Geht man von Start zu Ziel, so wäre der Index x, geht man von Ziel zu Start, so ist der Index -x. Eine Fläche ist damit mit den Indizes 1,2,3,4 beispielweise beschrieben. Davon gibt es entsprechend 6 Flächen für den Würfel.
Alle Segmente werden nun mit der Ebene geschnitten. Gleichzeit wird sich gemerkt, ob die Ebene schneidet (der Schnittpunkt wird gemerkt) und wenn auf welcher Seite Startpunkt und Endpunkt liegen. Anschließend baut dem Körper wieder zusammen: Jeder Segment im Loop wird gefragt, ob es zur Seite gehört, die erhalten bleibt oder schneidet. Wird geschnitten, so wird der Schnittpunkt gemerkt. Da jeder Loop, der geschnitten wird immer gradzahlig (bei Würfeln genau 2mal) schneiden muss, entsteht so pro geschnittenem Loop ein Segment von Ausgehendem Schnittpunkt 1 zu eingehendem Schnittpunkt. Die Segmente speichere ich in einem zusätzlichem Loop.
Im Standardfall, fällt ein Loop weg, weil er komplett im abzutrennenden Bereich liegt. Die gesammelten Segmente der vier geschnittenen Flächen ergeben aber einen neuen Deckel.
Wird nur eine Ecke abgeschnitten, so bleiben alle 6 Loops (teils geschnitten) erhalten, es kommt ein 7 Loop hinzu, der das Lock schließt.
Sonderfälle abfangen (Ebene berührt nur und liegt außerhalb) und fertig ist die Geschichte.
Leverator hat geschrieben:Auf den ersten Blick sieht sie ganz gut aus, jedoch besteht ein Problem: Die gespeicherten Punkte, die eine Ebene bilden sollen, bilden keine exate mathematische Ebene. Das Problem besteht darin, wie die Zahlen im Rechner dargestellt werden. Und hier haben wir eine begrenzte Genauigkeit.
Das stimmt. Da kannst Du aber schlussendlich auch nichts dran ändern. Jeder Punkt beim Würfel liegt auf drei Flächen und wenn das nicht exakt passt (z.B. weil die Kanten genau den Dimensionen folgen), dann musst Du ein wenig Spielraum haben, wo Du behauptest, dass der vierte Punkt nunmal jetzt doch genau auf der Ebene liegt, den die drei anderen Punkte aufspannen.
Leverator hat geschrieben:Vielleicht ist es sinnvoller, wenn man eine Fläche wie folgt darstellt:
1. Einen "Schwerpunkt" der Fläche definieren.
2. Alle Punkte der Fläche werden relativ zu dem Schwerpunkt gemessen und in Form von Abstand und Winkel gespeichert.
Abstand und Winkel ist immer problematisch: Je größer der Abstand, desto mehr verstärkt sich die Ungenauigkeit der Winkel. Da Du auch zwei Winkel brauchst, um eine Position im Raum zu bestimmen, verlierst Du reichlich Nachkommastellen.
Leverator hat geschrieben:Vielleicht kann man die Genauigkeit dadurch austricksen, indem man für die Anwendung eine bestimmte Genauigkeit festlegt und dann statt mit Fließkommazahlen zu rechnen, das Ganze in Festpunktzahlen umwandelt.
Warum Festkommazahlen? Du hast eine 53 Bit Mantisse. Wenn Du den zu betrachtenden Raum möglichst klein hältst, hast Du möglichst wenig Rundungsfehler.
Sinnvoll wäre große Transformationen rauszurechnen. Ein Würfel von 1ccm größe, der in der stationären Bahn positioniert ist, kann man absolut positionieren, dann fällt aber die Genauigkeit von "Das ist 1 cm" oder man beschreibt den Würfel exakt und fügt für den Körper, der ein Ausmaß von 1ccm hat, eine relative Verschieben auf die stationäre Umlaufbahn hinzu, die sich auf alle Punkte des Körpers beziehen.
Das sind dann natürlich mehr Daten erforderlich.
Leverator hat geschrieben:Vielleicht müssen wir auch garnicht ein Objekt zerschneiden, sondern nur die Bearbeitungsschritte an diesem Objekt merken.
Das ist eine übliches Vorgehen. Aber irgendwann muss man was darstellen und dann muss auch was gerechnet werden. Man kann schließlich nicht sagen "Hier ist eine Box, stellen Sie sich bitte vor, dass sie den Teil davon nicht sehen."
Leverator hat geschrieben:Wenn wir mal von einem realen Beispiel ausgehen wollen: Das Dach eines Hauses benötigt ein Loch, damit man dort den Schornstein eines Kamins durchziehen kann.
Vielleicht lässt man in der Datenstruktur das Dach als Ganzes und berechnet das Loch nur in der Darstellung hinein. Jenachdem wie stark der Nutzer auf das Objekt gezoomt hat, kann man die Berechnung mehr oder weniger genau durchführen.
Will der Nutzer plötzlich, dass der Kamin an einer anderen Stelle im Haus aufgebaut wird, so muss die Software auch nicht mehr umständlich das Loch "flicken", sondern einfach nur in der Darstellung den Bearbeitungsschritt anpassen.
Erst ganz zum Schluss, wenn der Bauplan "gerendert" werden muss, werden die entsprechenden mathematischen Operationen am Objekt durchgeführt und die Positionen auf eine gewisse Genauigkeit gerundet.
Ich muss rendern können. ^^
Tatsächlich wird die geschnittene Box als ein Abzugskörper konstruiert, der von einem anderen Körper abgezogen wird.
Beispiel: Ein Quader ist eine Wand, die oben schräg abschnitten werden soll. Von dieser Wand wird ein unendlich großer Körper abgezogen, der an einer Ebene abgeschnitten wird: Ein sogenannter Halbraum. Unendlich groß ist immer unpraktisch, deswegen konstruiere ich eine Box, die so groß ist, wie die Wand und schneide den Teil der Wand aus der Box heraus, der stehen bleiben soll. Den übrigen Körper schneide ich vom Quader der Wand ab.