Klausur Computergrafik WS 2007 / 08. Lösungshilfe

Ähnliche Dokumente
Klausur Computergrafik WS 2007 / 08

Klausur Computergrafik SS 2007

Klausur Computergrafik WS 2008 / 09

Klausur Computergrafik SS 2008

Klausur Computergrafik SS Lösungshilfe

Klausur Computergrafik für Bachelor-Studierende SS 2015

Klausur Computergrafik für Bachelor-Studierende WS 2009 / 10

Klausur Computergrafik für Bachelor-Studierende SS Lösungshilfe

Klausur Computergrafik für Bachelor-Studierende WS 2010 / 11. Lösungshilfe

Klausur Datenverarbeitung WS 2001/02

Klausur Computergrafik für Bachelor-Studierende WS 2010 / 11

Klausur Computergrafik für Bachelor-Studierende SS 2018

Klausur Computergrafik für Bachelor-Studierende SS Lösungshilfe

Klausur Datenverarbeitung / Informatik SS 2004

Klausur Datenverarbeitung WS 2000/01

Klausur Grundlagen der Informatik SS 2013

Klausur Computergrafik für Bachelor-Studierende SS 2017

Klausur Datenverarbeitung SS 2001

Klausur Computergrafik für Bachelor-Studierende WS 2011 / 12. Lösungshilfe

Klausur Grundlagen der Informatik SS Lösungshilfe

Klausur Systemprogrammierung WS 2003 / 04

Klausur Computergrafik für Bachelor-Studierende SS 2011

Klausur Grundlagen der Informatik WS 2012 / 13

Klausur Grundlagen der Informatik WS 2015 / 16

Klausur Systemprogrammierung WS 2002/03

Klausur Grundlagen der Informatik SS 2015

Klausur Systemprogrammierung WS 2005 / 06. Lösungshilfe

Klausur Computergrafik für Bachelor-Studierende WS 2012 / 13

Klausur Datenverarbeitung / Informatik SS Lösungshilfe

Programmierpraktikum 3D Computer Grafik

Klausur Computergrafik für Bachelor-Studierende SS 2013

Klausur Computergrafik für Bachelor-Studierende SS Lösungshilfe

Klausur Grundlagen der Informatik SS 2014

Klausur Datenverarbeitung WS 2000/01. Lösungshilfe

2D-Punkt-Transformationen

Computergrafik SS 2008 Oliver Vornberger. Kapitel 21: OpenGl

Kapitel 21: OpenGl 1

Klausur Datenverarbeitung / Informatik SS 2002

Übungsblatt

Klausur Grundlagen der Informatik WS 2015 / 16. Lösungshilfe

Übungsstunde 5 zu Computergrafik 1

Klausur Grundlagen der Informatik WS 2012 / 13. Lösungshilfe

3D-Transformationen. Kapitel Translation Skalierung

Transformation - Homogene Koordinaten. y + b )

Transformation Allgemeines Die Lage eines Punktes kann durch einen Ortsvektor (ausgehend vom Ursprung des Koordinatensystems

Klausur Datenverarbeitung / Informatik SS Lösungshilfe

3D-Transformationen. Kapitel Translation Skalierung

KREISFUNKTIONEN. Allgemeines

Klausur Systemprogrammierung WS 2001/02

Aufgabe 1. Die Determinante ist eine lineare Abbildung von C n n nach C? Nein (außer für n = 1). Es gilt det(λa) = (λ) n det(a).

Klassische Theoretische Physik II (Theorie B) Sommersemester 2016

FH Gießen-Friedberg, FB 06 (MNI) Lösungen zu Übungsblatt 8 Einführung in die höhere Mathematik 6. Dezember 2006 Prof. Dr. H.-R.

Transformation - 3. Für "übliche" Anwendungen in der Geometrie ist es sinnvoll, bei Transformationen eine gleiche

Lösung - Serie 2. D-MAVT/D-MATL Analysis I HS 2017 Dr. Andreas Steiger Welche der folgenden Funktionen ( 1, 1) R sind strikt monoton wachsend?

Lineare Transformationen und Determinanten. 10-E Ma 1 Lubov Vassilevskaya

Viel Erfolg bei der Bearbeitung der Aufgaben!

Probeklausur: Programmierung WS04/05

Einführung in OpenGL. Einführung in OpenGL

Klausur Konzepte Systemnaher Programmierung WS 2008 / 09

Klausur "ADP" SS 2012

3D-Sicht, Projektionen

FH Gießen-Friedberg, Sommersemester 2010 Skript 9 Diskrete Mathematik (Informatik) 30. April 2010 Prof. Dr. Hans-Rudolf Metz.

Klausur Datenverarbeitung SS Lösungshilfe

Klausur Datenverarbeitung / Informatik SS 2003

Klausur zur Vorlesung Lineare Algebra B im SS 2002 an der Universität Hannover

Grafikprogrammierung (Echtzeitrendering)

Einführung in die objektorientierte Programmierung mit C++

Herbstsemester ist es.

Aufgabenblatt 1. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

Klausur Datenverarbeitung / Informatik WS 2003/04

Klausur Einführung in die Informatik I für Elektrotechniker 16. Juli 2003

Lehrstuhl II für Mathematik. Bachelor-Prüfung/Diplom-Vorprüfung/Zwischenprüfung. Höhere Mathematik I. Matrikelnummer:

Computer Vision I. Nikos Canterakis. Lehrstuhl für Mustererkennung, Universität Freiburg,

Klausur Grundlagen der Programmierung

Grundlagen der Physik 2 Lösung zu Übungsblatt 12

Test-Klausuraufgaben Softwaretechnik Fachbereich BW, für WINFO

Computergrafik Universität Osnabrück, Henning Wenke,

Computergraphik Grundlagen

Klausur Systemprogrammierung SS 2010

Klausur Systemprogrammierung WS 2003 / 04. Lösungshilfe

3. Erweiterung der trigonometrischen Funktionen

Klausur Robotik/Steuerungstechnik

Mathematische Einführung

Klausur Systemprogrammierung WS 2004 / 05. Lösungshilfe

Fakultät für Physik Jan von Delft, Katharina Stadler, Frauke Schwarz T0: Rechenmethoden für Physiker, WiSe 2013/14.

Teil 3 Abbildungen in der Ebene

Klausur Grundlagen der Informatik WS 2016 / 17. Lösungshilfe

Klausur Systemprogrammierung WS 2001/02. Lösungshilfe

Institut für Informatik und Angewandte Kognitionswissenschaften

Hauptklausur zur Vorlesung Bildverarbeitung WS 2002/2003

Name:... Matr.-Nr... Bearbeitungszeit: 120 Minuten. Lesen Sie die Aufgaben jeweils bis zum Ende durch; oft gibt es hilfreiche Hinweise!

Konstruierbarkeit des Siebzehnecks

TECHNISCHE UNIVERSITÄT MÜNCHEN

Klausur Konzepte Systemnaher Programmierung SS Lösungshilfe

Verallgemeinerung von Sin, Cos, Tan mit GeoGebra

Einleitung 2. 1 Koordinatensysteme 2. 2 Lineare Abbildungen 4. 3 Literaturverzeichnis 7

Trigonometrie. Mag. DI Rainer Sickinger HTL. v 1 Mag. DI Rainer Sickinger Trigonometrie 1 / 1

Hans Delfs. Übungen zu Mathematik III für Medieninformatik

Mathematische Grundlagen

Transkript:

Fachhochschule Gießen-Friedberg Prof. Dr.-Ing. A. Christidis Fachbereich Mathematik, Naturwissenschaften und Informatik 18. März 2008 Personalien: Klausur Computergrafik WS 2007 / 08 Lösungshilfe Name, Vorname:... Matrikelnummer:... Hinweise: Die Bearbeitungszeit beträgt 90 Minuten. Alle schriftlichen Hilfsmittel sind zugelassen; andere Hilfsmittel, insb. elektronische Rechen- und Kommunikationsapparate dürfen nicht verwendet werden. Die Aufgaben sollen nur auf diesen Aufgabenblättern bearbeitet werden. Bei Bedarf kann zusätzliches Papier zur Verfügung gestellt werden. Zur sicheren Zuordnung aller Lösungen wird um eine persönliche Kennung (Name u./o. Matrikelnr.) auf allen Blättern gebeten. Auf Wunsch darf auch Bleistift verwendet werden. Zur leichteren Lesbarkeit werden Substantive nur in einem Geschlecht ( Nutzerin ) verwendet.

1. Aufgabe (25 Punkte) a) Sie arbeiten mit an einem Projekt zur Weiterentwicklung von Anzeigegeräten (Joystick, Maus, Knob Box,...). Zu Ihren Aufgaben gehören vor allem der Entwurf und die Echtzeit-Darstellung neuer Cursor-Grafiken (Pfeile, Fadenkreuze, Sanduhren etc.). Damit sich Ihre Software selbst testen kann, haben Sie Routinen implementiert, welche die Cursor-Bewegungen dokumentieren und immer wieder Screenshots (Abbilder der Bildschirm- Anzeige) erstellen, die sie zum Abgleich der Cursor-Position untersuchen. Verwenden Sie in Ihrer Arbeit Verfahren der Computergrafik, der Bildverarbeitung, beider oder weder der einen noch der anderen? Begründen Sie Ihre Antwort! Beider: Entwurf und Darstellung von Anzeigen gehört zur Computergrafik, Suche und Ortung von Mustern innerhalb eines Pixelbildes (Screenshot) gehören zur Bildverarbeitung. b) Der Bresenham-Algorithmus ist für den ersten Oktanten entworfen worden und muß zur Anwendung auf andere Oktanten angepaßt werden. An welchem Fehler (kurze Beschreibung) läßt es sich erkennen, wenn der Algorithmus ohne Anpassung auf den 2. Oktanten angewandt wird? Erklären Sie kurz anhand der MidpointLine()-Routine, wie dieser Fehler entsteht. Es gibt Lücken in der Linie. Der Grund ist, daß jedem x-wert genau ein y- Wert zugeordnet wird, obwohl mehrere zu ihm gehören. Das erkennt man auch an der Code-Zeile: for (x=x0; x < xn; x++) Hier müßten in diesem Fall y-werte (y, y0, yn) statt x-werten stehen. c) Es sollen mit Hilfe des Bresenham-Algorithmus die Koordinaten ermittelt werden, die eine gerasterte Linie mit den Anfangskoordinaten (-15,-17) und den Endkoordinaten (-5,-10) durchläuft. Auf welchen Oktanten bezieht sich diese Anwendung des Linien-Algorithmus? (Nennung genügt.) Auf den 1. Prof. Dr.-Ing. A. Christidis FB MNI S. 2 / 13

d) Sie zeigen einer Freundin mit berechtigtem Stolz, daß Ihre selbstentwickelte Grafik-Software dank Bresenham-Implementierung das Drahtmodell einer Kugel mit 320 Dreiecken (s. Abb.), auch ohne Backface Culling, bildfüllend, in Echtzeit, wie einen Kinofilm darstellen kann. Ihre Freundin behauptet, Ihre Software wäre auch ohne die Implementierung des Bresenham-Algorithmus echtzeitfähig gewesen: Die Einsparung von einer Floatingpoint-Operation je Pixel würde, bei geschätzten 10 Nanosekunden pro Floatingpoint-Operation, auch noch bei einem durchschnittlichen Dreiecksumriß von 1.000 Pixeln die Frequenz Ihrer Software auch nicht wie einen frühen Chaplin-Film aussehen lassen. Angenommen, Ihre Freundin hat die richtigen Zahlen im Kopf: Hat sie recht mit ihrer Behauptung, wenn Sie genau nachrechnen? Differenz t der Rendering-Zeiten pro Bild, wenn je Pixel eine Floatingpoint-Operation einzuplanen ist: t = 10 nsec/ Floatingpoint-Operation * 1 Floatingpoint-Operation/Pixel * 1.000 Pixel/Dreieck * 320 Dreiecke = 3.200.000 nsec = 3.200 µsec = 3,2 msec. Die Auffrischungszeit pro Bild beträgt im modernen Kino 41,66... ms (24 Hz), bei Chaplin waren es noch 62,5 ms (16 Hz). Die Differenz von 20,833... ms ist deutlich höher als die o.a. 3,2 ms. Die Freundin hat recht! e) Über ein Bild mit den Maßen x=300 Pixel und y=400 Pixel zeichnen Sie nach dem Bresenham-Algorithmus eine Diagonale. Wieviele Pixel genau werden dabei gesetzt, wenn sowohl Anfangs- als auch Endpixel gesetzt werden? Erläutern Sie bitte kurz (Skizze, Rechnung oder Beschreibung), wie Sie zu Ihrem Ergebnis kommen! 400 Pixel werden gesetzt: Der Bresenham-Algorithmus nimmt immer die längste Ausdehnung (hier: y=400 Pixel) als Bezugsrichtung und ermittelt lediglich zu jedem Pixel in dieser Richtung die passende Koordinate in der anderen Richtung, um ein Pixel zu setzen. Prof. Dr.-Ing. A. Christidis FB MNI S. 3 / 13

2. Aufgabe (40 Punkte) Zwei Fliegen (im folgenden betrachtet als Punkte im Raum) begegnen sich in einem Zimmer, an einer Hängelampe, die nachfolgend den Koordinaten-Ursprung markieren soll. Als sie sich das erste Mal erblicken, hat die eine die kartesischen Koordinaten f 1 =(0, 6, 8), während die andere bei f 2 =(10, 6, 8) fliegt. Die letztere, gesellige Fliege dreht einen Dreiviertel-Kreis (θ=270 ) um eine Achse, die durch den Ursprung (Lampe) und ihre Artgenossin führt. Berechnen Sie ihren Flug und die anschließende Annäherung, indem Sie folgende Teilaufgaben wie in der Vorlesung besprochen lösen. (Die Werte der trigonometrischen Winkelfunktionen zu den hier vorkommenden Winkeln werden als bekannt vorausgesetzt; Folgefehler werden nicht angerechnet.) Zunächst soll die Drehachse um eine der Hauptachsen (x, y, z) gedreht werden, bis sie mit einer der Hauptebenen (x-y-, y-z-, x-z-ebene) zusammenfällt. a) Wenn Sie hier die Drehachse um den Winkel α um die z-achse bis zur y-z- Ebene rotieren lassen wollen wie berechnen sich der Sinus und der Cosinus des zugehörigen Winkels? sin α = X / (X²+Y²) ½ = 0 / (0²+6²) ½ = 0 / 6 = 0 cos α = Y / (X²+Y²) ½ = 6 / 6 = 6 / (0²+6²) ½ = 1 b) Wie lautet die Transformationsmatrix, die diese freie Drehachse um die z- Achse dreht, bis sie mit der y-z-ebene zusammenfällt? Schreiben Sie sie bitte in symbolischer und arithmetischer Form. Wie erklären Sie sich die Zahlenwerte in der Matrix aus der Anschauung in der Aufgabenstellung? Rz(α) = cosα -sinα 0 0 sinα cosα 0 0 0 0 1 0 = 1 0 0 0 0 1 0 0 0 0 1 0 Die Rotationsmatrix ist eine Einheitsmatrix: Die ruhige Fliege liegt bereits in der y-z-ebene (x-koordinate=0). Prof. Dr.-Ing. A. Christidis FB MNI S. 4 / 13

c) Als Nächstes wollen Sie die Drehachse um den Winkel β um die x-achse rotieren lassen, bis sie mit der z-achse zusammenfällt. Wie berechnen sich Sinus und Cosinus des Winkels β (symbolisch und arithmetisch)? sin β = (X²+Y²) ½ / (X²+Y²+Z²) ½ = 6 / (36+64) ½ = 0,6 cos β = Z / (X²+Y²+Z²) ½ = 8 / (36+64) ½ = 0,8 d) Wie lautet die Transformationsmatrix Rx(β), die diese freie Drehachse um die x-achse dreht, bis sie mit der z-achse zusammenfällt? Schreiben Sie sie bitte in symbolischer und arithmetischer Form. Rx(β) = 1 0 0 0 0 cosβ -sinβ 0 0 sinβ cosβ 0 = 1 0 0 0 0 0,8-0,6 0 0 0,6 0,8 0 e) Wie lautet nun die Matrix für die Rotation der Fliege um die so transformierte z-achse? Geben Sie bitte die symbolische und die zahlenmäßige Form an: Rz(θ) = cosθ -sinθ 0 0 sinθ cosθ 0 0 0 0 1 0 = 0 1 0 0-1 0 0 0 0 0 1 0 Prof. Dr.-Ing. A. Christidis FB MNI S. 5 / 13

f) Stellen Sie nun die Rotation der Fliege um die freie Drehachse in symbolischer Form zusammen und vereinfachen Sie sie in dieser Form soweit wie möglich: R(θ) = Rz(-α) Rx(-β) Rz(θ) Rx(β) Rz(α) [ Rz(α): Einheitsmatrix, = Rx(β) T Rz(θ) Rx(β) Rx(β): orthogonal ] g) Berechnen Sie jetzt bitte die Transformationsmatrix für die Rotation unserer Fliege auch in arithmetischer Form R(θ) = 0 1 0 0-1 0 0 0 0 0 1 0 1 0 0 0 0 0,8-0,6 0 0 0,6 0,8 0 = 1 0 0 0 0 0,8 0,6 0 0-0,6 0,8 0 0 1 0 0-0,8 0 0,6 0 0,6 0 0,8 0 0 0,8-0,6 0-0,8 0,36 0,48 0 0,6 0,48 0,64 0 R(θ) Prof. Dr.-Ing. A. Christidis FB MNI S. 6 / 13

h) Welches sind nun die Koordinaten der kontaktfreudigen Fliege nach ihrem Rundflug um das Objekt ihrer Begierde? Und, da die umworbene Fliege auch die Drehung um dieselbe Achse mitgemacht hat: Ermitteln Sie die Endposition beider Fliegen! R(θ) [ f 1 f 2 ] = 0 10 6 6 8 8 1 1 = 0 0,8-0,6 0-0,8 0,36 0,48 0 0,6 0,48 0,64 0 4,8 4,8 4,8 4,8 2,16 + 3,84-8+2,16+3,84 2,88 + 5,12 6+2,88+5,12 1 1 = 0 0 6-2 8 14 1 1 i) Nun wollen Sie bitte der mobilen Fliege eine Translationsmatrix entwerfen, mit der sie ihrer Artgenossin bis zur Verschmelzung nahekommt. Führen Sie bitte als Nachweis auch die Matrizenmultiplikation durch, die die Koordinaten der geselligen in jene der ruhig gebliebenen überführt. 0-2 14 1 1 0 0 0 0 1 0 8 0 0 1-6 0 6 8 1 Prof. Dr.-Ing. A. Christidis FB MNI S. 7 / 13

3. Aufgabe (20 Punkte) Sie helfen einem Freund, ein Grafik-Programm zu entwickeln, und klären zunächst einige Fragen bezüglich der GLUT-Bibliothek, die er in main() einsetzt: int main(int argc, char **argv) { glutinit(&argc, argv); glutinitwindowsize(300,300); glutcreatewindow("cg goes OpenGL"); glutdisplayfunc(draw); glutkeyboardfunc(key); init(); glutmainloop(); return 0; } Beantworten Sie bitte folgende Fragen: a) Das Akronym GLUT steht bekanntlich für OpenGL Utility Toolkit. Wofür steht darin das Akronym OpenGL (ausgeschrieben), und was bedeutet inhaltlich das vorgesetzte Wort Open (stichwortartig)? OpenGL steht für Open Graphics Library ; Open bedeutet hierbei etwa: Erweiterbar. b) Die Anweisung glutcreatewindow() weist darauf hin, daß GLUT Fenster einrichtet. Klären Sie bitte folgende Fragen: Wie sehen GLUT-Fenster aus? Ändern sie ihr Aussehen, wenn man denselben Source-Code von einem Betriebs-/Fenstersystem auf ein anderes überträgt, bzw., wenn man innerhalb desselben Fenstersystems die Fensterdarstellung (das sog. Fensterdesign) ändert? GLUT richtet native Fenster ein; d.h., die Fenster sehen aus wie alle übrigen Fenster desselben Systems. Deswegen ändert sich das Aussehen sowohl beim Wechsel als auch bei Umstellung des Systems. c) Beim ersten Entwurf des Grafik-Programms wurde versehentlich die Anweisung glutcreatewindow() ausgelassen. Das Programm wurde erfolgreich compiliert, und nach dem Start gab es einen Programm-Absturz mit dem Hinweis auf eine Zugriffsverletzung. Kann dieses Verhalten mit dem vergessenen Statement zusammenhängen? Wenn ja: Welches Wissen über diese Anweisung würde das erklären? Wenn nein: Was für ein Programm-Verhalten wäre eher zu erwarten? Warum? Prof. Dr.-Ing. A. Christidis FB MNI S. 8 / 13

Ja; das ist sogar die Ursache: glutcreatewindow() richtet das GLUT- Fenster ein, d.h., es bereitet das System (Speicher etc.) darauf vor, ein (weiteres) Fenster zu verwalten. Ist der Speicher nicht reserviert, kommt es zwangsläufig zu Zugriffsverletzungen. d) Was bedeutet die Anweisung glutinitwindowsize() im allgemeinen, was im vorliegenden Fall? Was ändert sich, wenn sie ausgelassen wird? Sie setzt die Größe des neuen Fensters fest. Ihr Aufruf ist optional (zustandshaftes API). Da die Voreinstellung (300, 300) ist, würde sich hier nichts ändern, wenn sie ausgelassen würde. e) Darf die o.a. Anweisung glutinitwindowsize() auch vor dem Aufruf glutinit() stehen? Wenn ja: Ändert sich dadurch etwas für das aktuelle oder für andere GLUT- Fenster? Wenn nein: Gegen welche Regel der Design-Philosophie von GLUT verstößt solche Programmierung? Ja. Da dies der Festlegung neuer Standards dient und die hier gewählte Fenstergröße gleich dem Default-Wert ist, ändert dies weder am aktuellen noch an zukünftigen Fenstern etwas. f) Das Programm verwendet offenbar kein Double Buffering. Was ist das, und für welche Beziehung zwischen Bildrate und Bildauffrischungsrate eines Animationssystems ist es besonders interessant? Double Buffering ist die Technik, bei der die Grafik erst in einem (nicht sichtbaren) Hintergrund-Puffer entsteht, bevor sie in den (sichtbaren) Bildspeicher übertragen wird; das ist immer interessant für Anwendungen, bei denen die Bildrate unter die Bildauffrischungsrate fallen kann (genau genommen auch wenn sie ihr gefährlich nahe kommt). Prof. Dr.-Ing. A. Christidis FB MNI S. 9 / 13

g) Sie beabsichtigen, in spätere Versionen dieses Grafik-Programms eine Hilfe- Funktion zu integrieren, die über die Taste <F1> aufzurufen sein wird. Ist das main() dafür vorbereitet? Wenn ja: Woran erkennen Sie das? Wenn nein: Ist der Einbau einer solchen Funktionalität mit GLUT überhaupt codierbar, und, falls ja, wie? Nein, das Programm ist nicht dafür vorbereitet. Die C-Funktion, über welche die Funktionstasten ansprechbar sind, muß mit einem Aufruf von glutspecialfunc() angemeldet werden. h) Bei näherer Befassung mit dem gesamten Programm stellen Sie fest, daß der Prototyp der Funktion zur Fenster-Auffrischung void draw(void) lautet. Raten Sie Ihrem Freund, einen anderen Prototyp zu wählen, der mit seiner Parameterliste und seinem Rückgabewert den Umgang etwas intuitiver gestaltet? Wenn ja: Was wären interessante Kriterien zur sinnvollen Gestaltung eines GLUT-Programms? Wenn nein: Was macht einen solchen Prototypen erforderlich? Nein. Der Prototyp ist durch GLUT vorgegeben. Prof. Dr.-Ing. A. Christidis FB MNI S. 10 / 13

4. Aufgabe (15 Punkte) Zum o.a. main() schreiben Sie nun die Funktion draw() und wollen damit schwarz-weiße Drahtmodelle und Flächenmodelle (s. Abbn.) erzeugen. Abbn.: Gewünschte Drahtmodell- und Flächenmodell- Darstellungen (v.l.n.r.) Sie experimentieren mit draw() und stellen fest, daß die u.a. Programm-Version (bei Drahtmodellen ebenso wie bei Flächenmodellen) Bilder nach nebenstehender Abb. erzeugt. Sie erkennen schnell, daß dies am Aufruf: glpolygonmode(gl_back, GL_LINE); liegt, der richtig lauten sollte: glpolygonmode(gl_front_and_back, GL_LINE); a) Erklären Sie kurz das Programm-Verhalten, das zum o.a falschen Ergebnis führte. Wieso ist die Darstellung sowohl des Flächenmodells als auch des Drahtmodells falsch? Welche Rolle spielt dabei die Realisierung von OpenGL als Zustandsautomat mit Voreinstellungen? Der Aufruf glpolygonmode(gl_back,, GL_LINE) stellt die Rückseiten auf Liniendarstellung ein. Damit ist nichts über die Vorderflächen ausgesagt, und somit gilt die Voreinstellung des Zustandsautomaten; diese ist GL_FILL (bei Zeichenfarbe Schwarz). Da die Vorderflächen immer dargestellt werden, sind immer schwarze Flächen zu sehen. b) Nun wenden Sie sich mit Erfolg der gestrichelten Darstellung zu: Der abgebildete Würfel (Abb. li.) enthält zwei Linien- Muster, die einzelnen Flächen zugewiesen werden. Erklären Sie zunächst anhand des u.a. Code-Fragments, welchen Würfelflächen-Indizes welche der beiden Hexadezimal-Kennungen zugewiesen wird. Woran ist die Zuordnung zu erkennen? Prof. Dr.-Ing. A. Christidis FB MNI S. 11 / 13

Die bitweise UND-Verknüpfung (if (jj & 1)) mit der Eins gewährleistet, daß ungeradezahligen Flächen-Indizes das Muster 0x000F, den übrigen (inkl. Index 0) 0x0FFF zugeordnet wird. c) Beschreiben Sie am Beispiel einer Würfelkante, die von links nach rechts gezeichnet wird, wie die einzelnen Pixel gemäß dem übergebenen Bitmuster gesetzt werden (wieviele Pixel setzen, auslassen etc.): 0x000F = 0000 0000 0000 1111: 4 Pixel setzen, 12 Pixel auslassen,... 0x0FFF = 0000 1111 1111 1111: 12 Pixel setzen, 4 Pixel auslassen,... void draw(void) { int jj; nah=eyez; fern=nah+2*diag; glclearcolor (1.0, 1.0, 1.0, 1.0); glcolor3f(0.0, 0.0, 0.0); glmatrixmode(gl_projection); glloadidentity(); glfrustum (-diag, diag, -diag, diag, nah, fern); if (backf) glenable (GL_CULL_FACE); else gldisable (GL_CULL_FACE); if (stipple) glenable (GL_LINE_STIPPLE); else gldisable (GL_LINE_STIPPLE); /*Vorerst nur als Drahtmodell:*/ glpolygonmode(gl_back, GL_LINE); glclear(gl_color_buffer_bit); /*Ins Sichtvolumen verschieben:*/ /*.. */ /*Wuerfel zeichnen:*/ for (jj = 0; jj < 6; jj++) { if (jj & 1) gllinestipple(1, 0x000F); else gllinestipple(1, 0x0FFF); glbegin(gl_polygon); glvertex3fv(&vrtx[faces[jj][0]][0]); glvertex3fv(&vrtx[faces[jj][1]][0]); glvertex3fv(&vrtx[faces[jj][2]][0]); glvertex3fv(&vrtx[faces[jj][3]][0]); glend(); } /*.. */ } Prof. Dr.-Ing. A. Christidis FB MNI S. 12 / 13

Platz für Notizen: Prof. Dr.-Ing. A. Christidis FB MNI S. 13 / 13