Besvarelse av obligatorisk oppgave 2 i IN229. Oppgaven bestod i å visualisere et vektorfelt g avledet av gradienten f til et skalarfelt f(x, y, z). Oppgaven består av fire deler:. Beregning av gradienten ved sentraldifferanser. 2. Visualisering av vektorfeltet på to forskjellige metoder: () x-komponenten til vektorfeltet (2) absoluttverdien til vektorfeltet 3. Visualisering av et sett strømlinjer gjennom vektorfeltet. 4. Animasjon av av et sett strømlinjer gjennom vektorfeltet. Oppgave. Denne oppgaven består av:. Les inn en datafil Auh.vtk med et skalarfelt 2. Utfør eventuell byte-swapping (i tilfelle av Little-endian byte-rekkefølge). 3. Beregn approksimasjonen g til gradienten f (og ta absoluttverdien av komponenten f z. 4. Skaler vektorfeltet g for å gjøre det mer egnet til visualisering. 5. I tilfelle av Little-endian byte-rekkefølge: Utfør byte-swapping. 6. Skriv den beregnede approksimasjonen til filen Auh.vec.vtk Lesing/skriving av data er gjort ved hjelp av oppgitt programkode. Gradienten til f ( f f = x, f y, f ) z er tilnærmet med sentraldifferanser: f x [f(i +, j, k) f(i, j, k)] 2dx f y [f(i, j +, k) f(i, j, k)] 2dy f z [f(i, j, k + ) f(i, j, k )] 2dz Vi får dermed denne programkoden for å beregne gradientfeltet:
// Calculate gradient field... float g[ni][nj][nk][3]; int i, j, k; for (k = ; k < nk-; k++) for (j = ; j < nj-; j++) for (i = ; i < ni-; i++) { g[i][j][k][0] = (f[i+][j][k]-f[i-][j][k])/(2*dx); g[i][j][k][] = (f[i][j+][k]-f[i][j-][k])/(2*dy); g[i][j][k][2] = fabs((f[i][j][k+]-f[i][j][k-])/(2*dz)); } g_min og g_max er funnet ved gjennomløping av datasettet. Skaleringen er deretter gjort i henhold til løsningsforslaget i oppgaven: // Scale gradient vectors... for (k = ; k < nk-; k++) for (j = ; j < nj-; j++) for (i = ; i < ni-; i++) { gx = g[i][j][k][0]; gy = g[i][j][k][]; gz = g[i][j][k][2]; } g_val = sqrt(gx*gx + gy*gy + gz*gz); g_prime = min_prime + (g_val-g_min)*(max_prime-min_prime)/(g_max-g_min); gx = gx*g_prime/g_val; gy = gy*g_prime/g_val; gz = gz*g_prime/g_val; g[i][j][k][0] = gx; g[i][j][k][] = gy; g[i][j][k][2] = gz; Oppgave 2. Programdesign. Sett opp Graphics framework : vtkrenderer vtkrenderwindow vtkrenderwindowinteractor Generer datakilden: vtkstructuredpointsreader 2
Sett opp filtrene vtkextractvectorcomponents og vtkextractvectorcomponents Sett opp skjæringsplanet (vtkcutter). Generer lookup-table (for farvekoding av isoflaten og skjæringsplanet). Generer farveskalaen. Generer iso-flaten. Programmer en UserMethod for å kunne lagre bildet på en fil (Merk at denne metoden vil lagre bildet på PPM-format.) Det beregnede datasettet skal visualiseres på to forskjellige måter: The visualization pipeline vil være lik for disse to variantene; forskjellen består i hvilket filter man benytter for å hente ut data fra datakilden. Vizualisation pipeline er dokumentert i Fig. Oppgave 3 Denne oppgaven består i å visualisere strømlinjene gjennom vektorfeltet vi studerer. En overordnet formulering av oppgaven ser slik ut: Sett opp Graphics framework : vtkrenderer vtkrenderwindow vtkrenderwindowinteractor Genererer et antal vtkstreamline-objekter Initialiser disse med fornuftige verdier: Steg-lengde Steglengde for integrasjon Start-punkt Programmer en UserMethod for å kunne lagre bildet på en fil. Jeg viser til Fig. 2 for dokumentasjon av vizualisation pipeline. Oppgave 4 Denne oppgaven består i å generere en animasjon av strømlinjene gjennom vektorfeltet vi studerer. Design av programmet bygger på designen Oppgave 3; med animasjon av strmningene. I tillegg til denne kommer: Generer et sett med kuler som skal løpe langs strømlinjene. Modifiser User method, slik at denne faktisk utfører visualiseringen.. Forøvrig vises til Fig. 3 for dokumentasjon av the vizualisation pipeline. 3
Datakilde, AuH.vec.vtk vtklookuptable vtkextractvectorcomponents vtkcutter vtkcontourfilter vtkdatasetmapper vtkcontourfilter Figure : Pipeline for visualisering av x komponenten av vektorfeltet. For å visualisere vektorfeltet, erstatt filteret vtkextractvectorcomponents er erstattet med filteret vtkvectornorm. 4
vtkstructuredpointsreader vtkstreamline vtkcubesource vtkextractedges. Figure 2: Pipeline for visualisering av strømlinjene generert av vektorfeltet vtkstructuredpointsreader vtkstreamline vtkspheresource vtkcubesource vtkextractedges. Figure 3: Pipeline for animasjon av strømlinjene generert av vektorfeltet 5