Die ursprünglich von Martin Newell entworfene Teekanne in Utah ist ein praktisches Objekt zum Testen von 3D-Grafikprogrammen.
Die Aufgabe besteht darin, ein Drahtmodellbild der Teekanne in perspektivischer Projektion zu erstellen. Um die Idee einer Quellcode-Anwendung zu fördern , können die Anzeige und die Kamerasteuerung isoliert und von der Zählung ausgeschlossen werden. Auf diese Weise können die Parameter und die Eingabedatei geändert und der Code erneut verwendet werden, um verschiedene Bilder zu generieren. Es ist jedoch nicht erforderlich, ein vollwertiges Dienstprogramm zu erstellen, das komplizierte Befehlszeilenargumente oder ähnliches akzeptiert. Ein "hackeriges" Gleichgewicht wird angestrebt.
ref. StackOverflow: Wie funktionieren Bezier-Patches in der Utah-Teekanne?
Hier gibt es also drei Unteraufgaben:
- Einlesen der Teekannendaten im Originalformat .
- Unterteilen Sie die Patch-Daten mit deCasteljau Splitting oder einer anderen Methode. Andere Methoden verwenden Bezier-Basismatrizen und werten die Polynome aus (Standardreferenzen wie Foley und van Dam, Newmann und Sproull) oder Bernstein-Basismethoden (die mir noch ein Rätsel sind).
- Projizieren Sie die Punkte auf 2D (wenn die Sprache 3D nicht nativ unterstützt) und zeichnen Sie die Konturen jedes kleinen Patches von einem Augenpunkt aus, dessen Ansicht auf einem LookAt-Punkt zentriert ist und dessen vertikale Achse mit der vertikalen Achse der Teekanne ausgerichtet ist (dh zeichnen Sie es "aufrecht" von einem schönen Standpunkt aus).
Unter der Annahme , dass aus einer Datei zeilenorientierten Textdaten zu lesen ist wenig Mühe, diese Herausforderung ist wirklich darum , hands-on mit Bi-Bezier - Patch - Daten.
Da der einfache normale Test für das Keulen der Rückseite nicht ausreicht (die Patches sind nicht alle nach außen gerichtet), ist keine Entfernung von versteckten Linien oder Oberflächen erforderlich. Als Drahtmodell sollte es gut aussehen, wenn die Rückseite sichtbar ist. Das Erscheinungsbild kann durch Anpassen der Linienbreite in Abhängigkeit vom Abstand zum Auge verbessert werden, dies ist jedoch nicht unbedingt erforderlich (meine eigenen Programme tun dies nicht).
Dies ist sowohl Code-Golf als auch Rosetta-Stone . Antworten, die am Golf teilnehmen, sollten wie gewohnt gezählt werden. Einsendungen in ungewöhnlichen Sprachen sind jedoch sehr erwünscht, auch wenn sie nicht besonders kurz sind.
Für Kolmogorov-Komplexitätsbegeisterte gibt es einen präziseren Datensatz, bei dem der gesamte Satz durch Hinzufügen von Rotationen und Spiegeln von Patches rekonstruiert werden kann. Und in Jim Blinns A Trip Down the Graphics Pipeline gibt es eine noch präzisere Methode zur Generierung, bei der die einzelnen Patches Rotations- oder andere Symmetrien aufweisen. Der gesamte Körper (oder Deckel) kann durch eine einzige Bézier-Kurve beschrieben werden, die um die y-Achse gedreht wird. Der Auslauf und die Griffe können durch die beiden Kurven ihres Profils beschrieben werden. Anschließend werden die Zwischenkontrollpunkte ausgewählt, um eine kreisförmige Extrusion zu approximieren.
quelle
glutSolidTeapot
undglutWireTeapot
nicht zuzulassen !glutWireTeapot
.Antworten:
Verarbeitung (Java), 314 (237 ohne Kamerasteuerung)
Ohne die Array-Definitionen:
Datenarray-Definitionen:
Mehr lesbare Version:
Und ein paar Bilder:
Eine andere Version mit einigen interessanten Effekten:
quelle
stroke(-1)
ist ein Byte kürzer alsstroke(255)
Nachsatz
Nicht vollständig golfen, aber dies zeigt einen anderen Ansatz als die Unterteilung in deCasteljau: die Bewertung des Basispolynoms. Uses mat.ps .
1112
Das Entfernen der vertikalen Linien und das Abzinsen der Parameter ergibt diese Version mit 1112 Zeichen. Uses mat.ps .
quelle