Johann Wolfgang Goethe-Universität Frankfurt am Main Fachbereich Informatik und Mathematik Institut für Informatik Graphische Datenverarbeitung Tobias Breiner Varrentrappstraße 40-42 60486 Frankfurt am Main Telefon +49 (0)69 798 - 24615 Fax +49 (0)69 798 - 24603 [email protected] Vorlesung Visualisierung WS 2005/06 Übungsblatt Nr. 4 Aufgabe 1: (Contouring) Eine wichtige Methode zur Visualisierung ortsbezogener (2D) skalarer Daten ist das sogenannte Contouring. Hierbei wird für jedes Pixel mit den Koordinaten (x,y) eine Funktion f(x,y) ausgewertet. Ergibt sich für f(x,y) ein vorher festgelegter Wert I so wird das Pixel besonders eingefärbt, ansonsten wird die Hintergrundfarbe gewählt. Es ergeben sich sogenannte Isolinien, wie sie z.B. als Höhenlinien in Landkarten bekannt sind. In einem Bild kann es durchaus mehrere verschiedene Isolinien geben. Das angegebene Verfahren ist aufwendig, da für jedes Pixel eine Auswertung von f(x,y) erfolgt. a) Skizzieren Sie einen Algorithmus welcher auf einem regelmäßigen 2D Gitter arbeitet. Gehen Sie dabei davon aus, dass die Anzahl der Gitterpunkte kleiner ist als die Anzahl der Pixel. Werten Sie für jede Gitterzelle aus, wo eine Isolinie die Zellenkante schneidet, verbinden Sie die Schnittpunkte durch Linien. Pseudo C-Code for( i= 0 ... Anzahl Gitterelemente in x-Richtung) for( j= 0 ... Anzahl Gitterelemente in y-Richtung) { x= CalcX(Pixel(i,j)); y= CalcY(Pixel(i,j)); bool A=f(x,y)>l; bool B=f(x+1,y)>l; bool C=f(x,y+1)>l; bool D=f(x+1,y+1)>l; int iFall = A*8+B*4+C*2+D; // es gibt 16 Fälle , können aber auf 4 Reduziert werden Fall 0 => 0 Fall 1 => 1 Fall 2 => 1 Fall 3 => 2 Fall 4 => 1 Fall 5 => 3 Fall 6 => 2 Fall 7 => 1 Fall 8 => 1 Fall 9 => 2 Fall 10 => 3 Fall 11 => 1 Fall 12 => 2 Fall 13 => 1 Fall 14 => 1 Fall 15 => 0 switch(iFall) { case 0; iRed = 0; bInv = false; iDreh = 0; break; case 1; iRed = 1; bInv = false; iDreh = 0; break; case 2; iRed = 1; bInv = false; iDreh = 1; break; case 3; iRed = 2; bInv = false; iDreh = 0; break; case 4; iRed = 1; bInv = false; iDreh = 2; break; … case 15; iRed = 0; bInv = true; iDreh = 0; break; } Dreh(A,B,C,D, iDreh); Inv (A,B,C,D, bInv); switch(iRed) { case 0; Färbe(Pixel(i,j), bInv); break; case 1; break; Interpoliere Linear zwischen A und B if(Wertt bei Pixelposition > l ) Färbe(Pixel(i,j), bInv); break; case 2; iRed = 1; bInv = false; iDreh = 1; Interpoliere Linear zwischen A und C, dann zwischen diesem Wert und B if(Wert bei Pixelposition > l ) Färbe(Pixel(i,j), bInv); break; case 3; Zweideutig !!! break; } } } b) Welche Probleme treten auf? Skizzieren Sie einen Problemfall und geben Sie Lösungsvorschläge an. Die Probleme treten im Fall 5 und 10 auf, hier gibt es Mehrdeutigkeiten Aufgabe 2: (Contouring & Connecting) Ausgehend von einem 2D Contouring Verfahren lässt sich ein dreidimensionaler Körper „scheibenweise“ aufbauen, indem Isolinien auf parallelen Scheiben gefunden werden und diese dann durch Dreiecke verbunden werden. Geben Sie einen Algorithmus für dieses Verfahren an. Welche Probleme treten auf? Wenn Verlauf einer Schicht topologisch nicht mit der benachbarten konform ist Aufgabe 3: (Volumenvisualisierung) a) Marching Cubes - Wieviele mögliche Flächenverlaufe gibt es beim Marching Cubes /Tetraeder Algorithmus? 256/16 - Wie kann man die Anzahl der Fälle reduzieren? auf 15/3 - Bei welchen dieser Fälle ist der Verlauf der Fläche nicht eindeutig definiert? Fälle 3, 6, 7, 10, 12, 13 sind nicht eindeutig Tetraeder: alle sind eindeutig - Können bei Anwendung dieses Verfahrens Kanten generiert werden, die zu mehr als zwei Dreiecken gehören? Warum? Aufgrund der mehrdeutigen Fälle Aufgabe 4: (Bilineare Interpolation) In der Vorlesung wurde die trilineare Interpolation zur Bestimmung von Werten innerhalb eines Voxels bei gegebenen Eckpunkten-werten vorgestellt. Ein entsprechendes Verfahren gibt es auch für den 2D-Fall, die bilineare Interpolation. a) Gegeben sei ein rechteckiger Patch mit folgenden Koordinaten und skalaren Werten: (1,4) (3,0) (8,3) (6,7) 0.5 0.1 0.7 0.3 Erst Transformationsmatrix ermitteln: Translation: (10 ( 01 (00 -3 ) 0) 1) Nach Translation ergeben sich folgende Werte: (-2,4) 0.5 (0,0) 0.1 (5,3) 0.7 (3,7) 0.3 Rotation: Winkel = arctan(-2/4) = arctan(-1/2) = -26,56 Grad (Hinweis: Positive Winkel werden in der Mathematik üblicherweise entgegen dem Uhrzeigersinn gemessen.) ( cos(-26,56) -sin(-26,56) ( sin(-26,56) cos(-26,56) (0 0 ( 0,8944 ( -0,4471 (0 0,4471 0,8944 0 0) 0) 1) 0) 0) 1) Nach Rotation ergeben sich folgende Werte: (-2,4) => (0; 4,78) (0,0) => (0; 0 ) (5,3) => (5,81; 0 ) (3,7) => (5,81; 4,78) Berechnen Sie mittels der bilinearen Interpolation die Werte innerhalb des Pacthes für folgende Koordinaten: (4,2) (6,5) (3,4) Neue Werte nach Translation: (1,2) (3,5) (0,4) Neue Werte nach Rotation: (1.7886;1.3417) (2.68;3.13) (1.7884;3,5776) Beispiel A: (1.7886;1.3417) Werte nach erster linearer OP in x-Richtung: fx= (1.7886 / 4,78) = 0,374 lineare Werteinterpolation zwischen 0,1 und 0,7 => 0,374*0,6+0,1= 0,3244 lineare Werteinterpolation zwischen 0,5 und 0,3 => 0,374*(-0,2)+0,5= 0,5748 Wert nach zweiter linearer OP in y-Richtung: fy= (1.3417 / 5,81) = 0.23 lineare Werteinterpolation zwischen 0,3244 und 0,5748=> 0,23*(0,5748-0,3244)+0,3244= 0,3819 b) Wie könnte eine bilneare Interpolation für ein Dreieck aussehen? 1.) Lineare Interpolation zwischen A und B entlang einer Parallelen zur Strecke BC die durch den zu interpolierenden Punkt geht 1.) Lineare Interpolation zwischen A und C entlang einer Parallelen zur Strecke BC die durch den zu interpolierenden Punkt geht 2.) Lineare Interpolation zwischen den Schnittpunkten AB/BC und AC/BC entlang der Parallelen zur Strecke BC