Aufgabe 1: (Contouring) - Graphische Datenverarbeitung

Werbung
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
Herunterladen