Informatikk og matematikk

Matematikk innen datavitenskapene

 
Med hovedvekt på grafisk databehandling
 

Innledning

 


Med dette prosjektet vil jeg prøve å formidle litt om sammenhengen mellom informasjonsteknologi (IKT, det som på folkemunne går under den ganske så uriktige betegnelsen ”data”) og forskjellige grener av matematikken. Jeg har valgt å ta for meg to temaer, nemlig bruk av programmeringsteknikker for å ”lage oss” matematiske hjelpemidler, og bruk av matematikk (i hovedsak lineær algebra) innen grafisk databehandling. Jeg vil klart legge hovedvekt på den siste delen, da denne er mest ”matematisk” i formen.

Mengden matematikk innen disse feltene er større enn man kanskje tror, og egne erfaringer viser at det er matematikken som skremmer de fleste datastudenter bort fra for eksempel bildebehandling og databasestudier.

Jeg kommer bare til å ”scratch the surface” i denne oppgaven og tar for meg noen få, enkle grunnleggende teknikker og eksempler.

 

Bildet på forsiden er fra verdens første helaftens datakonstruerte tegnefilm, Toy Story, som kom fra Walt Disneys dataanimatører i 1996  (hvorvidt betegnelsen ”tegnefilm” da blir dekkende tør jeg ikke å si noe om… Det er et ganske stort konfliktområde akkurat rundt dette. Datagrafikerne hevder kunsten er bevart, siden det hele tiden er mennesker som designer alt, og at datamaskinen ikke er noe annet enn et verktøy. Fra andre hold kommer kommentarer om at kunsten blir upersonlig, og samlebåndpreget. Debatten går, og kommer nok til å fortsette…). Det er vel kanskje på det store lerettet at vi får de virkelig kraftige dosene med datagrafikk.

 

 

 

Innhold

 

 

Del 1 : Å programmere en datamaskin til å bli et matematisk hjelpemiddel

·         Kort om programmeringsspråket Turbo Pascal

·         Rekursjon – en programmeringsteknikk

 

Del 2:  Grafisk databehandling

·         Skjermen m/koordinater

·         Scan konvertering

·         Transformasjoner

 

Avslutning, kommentarer og kilder


Vi programmerer en funksjon

 

 

Kort om programmeringsspråket Turbo Pascal

 

For å lage et dataprogram, må man skrive et sett eksakte, stringente instruksjoner, som en datamaskin kan forstå, tolke og utføre i rekkefølge. Programmeringsspråket som oftest brukes til opplæring er nå Pascal, eller Turbo Pascal (forskjellen er at sistnevnte er en større og mer utvidet versjon).  Det er også dette språket som brukes ved NTNU sine grunnkurs. Grunnen til at akkurat dette språket velges, er at det er veldig ryddig satt opp, og at teknikker som læres, forholdsvis lett kan transponeres til andre programmeringsspråk. Jeg skal nå ta for meg noen enkle instruksjoner, slik at man har et lite grunnlag, og dernest vise hvordan man kan løse et kjent matematisk problem ved hjelp av dette språket. Jeg går ikke helt grundig til verks når det gjelder korrekt ”dataskrivemåte” av disse kommandoene, men skriver de litt mer forståelig.

Jeg vil i dette eksemplet benytte rekursjon, en programmeringsmåte som ofte er brukt. I hovedsak går det ut på at man løser et problem ved å løse et annet problem som er enklere, men som likner. Ved å stadig løse enklere problem, kan man til slutt finne svaret ut fra elementære definisjoner. Man kan definere rekursjon litt humoristisk på denne måten:

Rekursjon : se rekursjon.

 

(Ofte er denne teknikken brukt uten hell, noe Telenor kan bekrefte… En av deres arbeidere skulle prøve ut et program han hadde skrevet. Programmet hadde feil, og det endte med at det startet en  rekursiv sletting på serveren til Telenor, slik at hjemmesidene til en stor mengde abonnenter forsvant.)

 

 

La oss se på et typisk, lite Pascal-program, der vi benytter oss av rekursjon:

 

 

program nr1;

 

function mystisk (n:integer):integer;

begin{Her begynner vi å definere funksjonen mystisk}

         if n=1 then

                   mystisk:=1

         else

                   mystisk:=n+mystisk (n-1);

end;{Her er vi ferdige med å definere funksjonen mystisk}

 

 

 

begin{Her begynner programmet}

         writeln(mystisk(4));

end.{Her slutter programmet}

 

Har man aldri sett et dataprogram før, kan nok dette fortone seg litt kryptisk. La oss gå rolig gjennom dette programmet og se hva som skjer. Når vi kjører i gang dette programmet, begynner datamaskinen på toppen og utfører instruksjonene i tur og orden.

Alt som står i klammeparenteser er kommentarer, som datamaskinen hopper over, og som ikke blir skrevet ut på skjermen når programmet kjøres. De er der altså bare for å hjelpe programmereren til å holde orden.

 

Den første linjen, ”program nr1” , betyr bare at vi kaller dette programmet for nr1. (Mange steder i et dataprogram må vi ha med et semikolon for å markere slutten av linjen, men det trenger vi ikke å gå nærmere innpå.)

 

I neste linje definerer vi oss en funksjon som vi kaller mystisk. Den kunne vi like gjerne ha kalt f, eller gamma, eller hva som helst. Poenget er at navnet er gjenkjennelig. Legg også merke til at funksjonen er definert (dataterminologi : ”deklarert”) før vi starter selve programmet!!

Det som står inne i parentesen betegner det vi vil ha inn i funksjonen vår, altså variabelen. Jeg har valgt å kalle den n, men kunne selvfølgelig ha brukt ”x”, eller ”tall” eller liknende. At det står ”integer” bak variabelen, betyr at vi forventer oss at vi skal få en integer, altså et heltall inn i denne funksjonen.

Til slutt på denne linja står det nok en gang integer, som betyr at funksjonen skal returnere en integer.

Altså…; Vi skal sende inn et heltall, og få et heltall som svar.

 

Det som nå står mellom begin og end; er det vi skal ha funksjonen til å gjøre. Det første er en if-setning, som sjekker om en tilstand er sann, og handler deretter som en følge av det. Vi ser at vi har to valg, enten er verdien vi får inn for n lik en eller den er ikke lik en, og avhengig av det, gjør vi et av to valg.

Hvis variabelen har verdi lik 1, setter vi funksjonsverdien lik 1.

Hvis variabelen er ulik 1, setter vi funksjonsverdien lik n+mystisk(n-1). Her trengs det kanskje forklaring. Det er nemlig her rekursjonen kommer inn. La meg forklare dette ved å se på et eksempel!

Vi får inn n=3. Da blir i første omgang mystisk satt til å være 3+mystisk(3-1)=3+mystisk(2). Funksjonen kaller altså opp seg selv igjen (det er dette som er rekursivitet!), og sender denne gangen heltallet to gjennom. Mystisk(2)=2+mystisk(2-1)=2+mystisk(1). Men når vi sender inn tallet en, får vi fra den første definisjonen i funksjonen at funksjonsverdien blir 1. Vi ser at vi her har en sum av funksjonsverdier, som til sammen blir den endelige funksjonsverdien 3+2+1=6. Mystisk(3) er altså lik 6.

På liknende måte kunne vi også ha definert en funksjon til å beregne fakultet til et tall!! Vi kan altså programmere datamaskinene til å utføre nesten hvilken som helst funksjonsberegning.

 

 

Videre i programmet ser vi at det står en ny begin og end. Det som står mellom her er selve hovedprogrammet. Det består altså bare av en instruksjon, ”writeln (mystisk(4))”. Kommandoen writeln betyr at det som står i etterfølgende parentes blir skrevet ut på skjermen.

): Det programmet gjør, er å beregne verdien av mystisk(4), og skriver denne verdien ut på dataskjermen. Ved å følge samme framgangsmåte som overfor, ser vi at mystisk(4)=4+3+2+1=10. Det eneste dette programmet vårt altså gjør, er å skrive ut tallet ”10” på dataskjermen. Kanskje ikke så veldig spennende…

 

 

 

La oss så gyve løs på det klassiske problemet om tårna i Hanoi….

 

I den gamle orienten, i den vietnamesiske byen Hanoi, døde vismannen til keiseren. For å finne en ny vismann, lagde keiseren en oppgave, og den som klarte å løse oppgaven, skulle få bli keiserens nye vismann. Problemet bestod av N skiver (han spesifiserte ikke hvor mange), og tre staver, der skivene kunne ligge; A(kilde), B(mål) og C(til overs). Skivene var av forskjellig størrelse, og hadde hull i midten, slik at de kunne passe på stavene. På grunn av vekten kunne en skive bare plasseres på toppen av en større skive, og ikke motsatt. Til å begynne med, var alle skivene på stav A. Problemet gikk ut på å flytte alle skivene fra stav A til stav B. Mange kom med sine løsninger, noen bestod av tusenvis av flyttinger. ”Jeg skjønner ikke disse løsningene”, sa keiseren. ”Det må jo være en enkel måte å gjøre dette på!”. Og det var det selvfølgelig. En vis buddhistisk munk kom etter hvert ned fra fjellene til keiseren og sa: ”Min sønn, dette problemet er så lett at det nesten løser seg selv!” Løsningen munken kom med var som følger:

”Hvis det bare er en skive (N=1), så flytter vi den fra A til B”. Alt vel så langt, men til og med landsbyenes klovn hadde gjort den biten rett… ”Hvis det er mer enn en skive, (N>1), så gjør du følgende:

1.      Ser bort fra den nederste skiva, og løser problemet for N-1 skiver, med den lille justering at målet er stav C i stedet for B.

2.      Når du har gjort det, vil N-1 skiver være på stav C, og den største vil være igjen på stav A. Så vi løser problemet for N=1 ved å flytte den fra A til B.

3.      Nå må du bare flytte de N-1 diskene fra stav C til stav B; det vil si, løse problemet med stav C som utgangspunkt, og stav B som mål.

 

Det ble stille noen sekunder, før keiseren utbrøt: ”Vel, skal du fortelle oss løsningen eller ikke?”. Hvorpå munken smilte og bega seg i vei til fjellet igjen.

 

Tydeligvis kunne ikke keiseren tenke rekursivt. Men det er faktisk ingenting i veien med løsningen som munken kom med.  Nøkkelen til å skjønne løsningen er å se at man kan løse problemet ved å løse tre mindre problem! La oss nå lage en prosedyre som gjør dette for oss. (En prosedyre er et ”delprogram” som kan utføres når som helst i et større program).

Vi betegner tower(antall, fra, til, overs) som problemet med å flytte antall skiver fra fra til til, og overs er den staven som blir til overs. I keiserens tilfelle: tower(N,A,B,C). Vi kan da sette opp munkens løsning slik:

1.      tower(N-1,A,C,B)         Altså se bort fra den nederste skiva, og løse problemet for resten.

2.      tower(1,A,B,C)   Løser problemet med å flytte den største fra A til B

3.      tower(N-1,C,B,A)         Flytter resten oppå den største. Problemet er løst.

 

Vi ser at vi her har brukt en rekursiv løsning:

·         Vi løser problemet ved å løse et lignende problem.

·         De andre problemene er enkelere, siden de involverer færre skiver.

·         Når det bare er en skive igjen, har vi allerede løsningen for hva vi skal gjøre.

·         Etter hvert som antall skiver minker, når vi til slutt et utgangspunkttilfelle (N=1)

 

Som en kuriositet tar jeg med prosedyren som løser problemet i Turbo Pascal, og som vi ser, er det i dette tilfellet lite kode som skal til for å løse et relativt tidkrevende problem:

 

Procedure tower(antall:integer; fra, til, overs:char);

Begin

         If antall=1

                   Then writeln(‘Flytt disk fra stav ‘,fra,’ til ‘, til)

                   Else

                        Begin

                                   Tower(antall-1,fra,overs,til);

                            Tower(1,fra,til,overs);

                            Tower(antall-1,overs,til,fra);

                   End

End.

 

Til slutt kan jeg nevne noen andre bruksområder for diskret matematikk innen programmering:

Trær, (binærtrær) brukes i katalogisering, for for eksempel å gjenfinne data i store datalagre.

Fibonacci-sekvenser og induksjonsbevis er også ting som egner seg godt innen programmering på grunn av de diskrete karakteristikkene.

 

Her har vi altså, med en meget begrenset kunnskap om programmering, benyttet en datamaskin til å lage en matematisk funksjon og til å løse et praktisk problem. Det er egentlig to hoveddeler å skille mellom når det gjelder IT og matematikk, nemlig problemløsning av matematiske problemer ved hjelp av datamaskin, og bruk av matematikk til å løse problemer relatert til informatikk.

Vi har sett eksempler på den første typen, og andre eksempler kan jo være innen medisin, der man tar i bruk datamaskiner for å løse komplekse statistiske problemer, for eksempel relatert til å gjøre røntgen-bilder så klare som mulig.

Jeg tar nå for meg den andre delen, og skal se på hvilken matematikk som spiller inn i grafisk databehandling.

 


Grafisk databehandling

 

Først, en liten notis: Grafisk databehandling er ikke det samme som bildebehandling, selv om de ofte , og også i denne oppgaven vil bli brukt om hverandre. Grafisk databehandling, består i å lage et bilde ut i fra data, mens bildebehandling består i å bruke teknikker for å forandre på et bilde som allerede er laget. Men det skaper som regel ikke store problemer selv om det skulle gå i surr med disse to begrepene.

 

Etter at datamaskiner har gjennomløpt en enorm utvikling, er det først og fremst det visuelle vi merker oss på en dataskjerm. Det ble for tungvint i lengden å skrive tungvinte kommandoer for å få noe utført. Grafisk design var løsningen, og med det moderne hjelpemiddelet, musen, kunne de aller fleste klare å utrette sine jobber på en dataskjerm. Skrivebordsmetaforen på skjermen har gjort det lettere for oss. Vi drar filer oppi papirkurven på skjermen for å slette dem. Vi drar dem oppå et printerikon for å få de skrevet ut, osv. Det er derfor av stor viktighet for informatikere og programerere å kunne matematikken bak slike grafiske programmer, brukergrensesnitt, og bilder generelt. Slik at man under utvikling av programvare kan lage hensynsfulle brukergrensesnitt / bruker-maskin-dialogformer. Dette er kanskje spesielt viktig i design av pedagogisk programvare.

Et annet meget stort satsingsområde (kanskje det største for grafisk databehandling) er dataassistert konstruksjon (DAK). I ingeniørarbeid finner vi flategrafikk i utstrakt bruk for å illustrere beregninger om for eksempel påkjenninger for en konstruksjon, eller aerodynamiske luftstrømmer rundt en bil.

 

Jeg starter med et lett eksempel.

 

Jeg vil nå først se på hvordan man tegner en linje på en dataskjerm.

 

Vi hadde tidligere to hovedtyper av dataskjermer, men nå er vektorskjermene gått nesten helt ut av bruk, og markedet er dominert av rasterskjermer. En rasterdataskjerm er egentlig en stor matrise, der antall punkt på skjermen blir større jo “bedre” datamaskin min har. Man kan dermed ha større nøyaktighet og flottere grafiske effekter. Oppløsningen er større, som man sier.

Skjermen er oppbygd som et stort koordinatsystem. En ganske vanlig oppløsning er at man har 800 x 600 punkt på skjermen. Men de kan variere fra ganske grove skjermer (320 x 200) til meget avanserte (1024 x 800). Som sagt, jo flere punkt, jo mer detaljerte punkter kan de vise. Hvor man plasserer origo hen, kan variere.

Et punkt på skjermen kalles en pixel (picture element). Et punkt kan ha en av mange forskjellige farger, også avhengig av hvor ”bra” datamaskinen er. For vårt formål holder det å tenke oss at punktet kan ha to tilstander; påslått eller avslått. Er punktet slått på, blir pixelen opplyst på skjermen av en elektronstråle som sveiper over skjermen med svært store hastigheter.

Dette at man bare kan tegne diskrete punkt, vil si at man må ha en algoritme for å tegne en tilnærmet kontinuerlig linje som går på skrå. Med dagens rasterskjermer må vi finne et antall diskrete punkt som best passer til en gitt linje. Jeg har forsøkt å lage en figur som illustrerer dette Vi trenger altså en algoritme, en regel, for hvordan vi skal regne ut koordinatene som best vil beskrive en slik linje.

Den enkleste tilfellet får vi når vi antar at stigningstallet er |m|<1.

 

Strategien for å “scan konvertere” (altså finne disse punktene som best beskriver linja) denne linja er å beregne dette stigningstallet, øke  x med 1 (starter fra venstre), beregne yi=mxi+B for hver xi og dermed plotte punktene (xi, Round(yi)). Round er en funksjon som er innebygd i de fleste programmeringsspråk, og som runder av til nærmeste hele verdi (vi kan selvfølgelig bare ha heltallsverdier for punktene). Denne algoritmen velger da ut det punktet som ligger nærmest den ønskede linja. Det som gjør saken litt verre enn ved “vanlig” matematikk, er at denne algoritmen er meget ineffektiv. For vi må gjøre en multiplikasjon av reelle tall for hver x, og operasjoner med reelle tall /flyttallsoperasjoner) er meget prosessorkrevende (”datakraftkrevende”) for en datamaskin. Derfor gjør vi følgende for å bli kvitt multiplikasjonen:

Hvis Dx=1 har vi at

.

 

Vi ser også at x1+1=xi+1, slik at både x og y er definert ut fra sine førverdier. Det er dette som gir en “økende algoritme”. Vi setter i gang beregningene ved (x0,y0), som er koordinatene for et endepunkt for linja. Hvis m>1 må vi bytte om rollene til x og y, men for oversiktens skyld beholder vi her utgangskriteriet. Jeg går ikke i detaljer for å skrive ut programmeringskoden, da den er meget lik utregningen her, men nevner at det som regel lages en funksjon (som i Hanoi Towers-eksemplet) som tar seg av dette. Denne funksjonen beregner alle punktene for to gitte punkt (startpunkt og endepunkt) og plotter punktene på skjermen.

 

Det er flere forskjellige måter å scan konvertere linjer på, noen av dem er forbedringer av ovenstående algoritme, noen foretar konvertering av linjer uansett stigningstall og så videre. Vi har også velkjente algoritmer for å scan konvertere sirkler.

 

Så langt har matematikken vært ganske enkel, likevel helt nødvendig for programmereren som skal lage et enkelt tegneprogram. La oss nå se på noen litt mer vanskelige grafiske databehandlingsteknikker, nemlig anvendelser av matrisemultiplikasjon:

 

 

 

 

2D transformasjoner

 

Vi har sett på hvordan man går fram for å få tegnet ut en ønsket linje på skjermen. La oss nå se på hvordan man i et tegneprogram ”bak kulissene” går fram for å flytte en linje fra et posisjon til et annet.

 

Vi kan translatere punkt i x-y-planet til nye posisjoner ved å legge til translasjonstall til punktkoordinatene. For hvert punkt P(x,y) som skal flyttes dx enheter i x-retning, og dy enheter i y-retning, til det nye punktet P’(x’,y’), kan vi skrive:

Vi definerer følgende kolonnevektorer

,

slik at translasjonen kan uttrykkes som

.

 


Det ville tatt alt for lang tid å translatere hvert eneste punkt på linja, men vi trenger bare å translatere endepunktene, og tegne opp en ny linje mellom dem. På figuren har jeg vist translasjon av en firkant.

 

 

 

 

 


Flere matriseoperasjoner

 

Vi kan også skalere (strekke, krympe), der vi finner de nye punktene ved likningene x’=sx×x og y’=sy×y. På matriseform:

.

 

På figuren under er huset skalert med en faktor <1 både i x-retning og  i y-retning. Legg merke til at skaleringen er gjort med hensyn på origo. Firkanten er mindre og nærmere origo. Hvis skaleringsfaktoren var større enn 1, ville firkanten blitt større og lenger bort fra origo. Hvis skaleringsfaktorene er like, vil figuren beholde sine opprinnelige proporsjoner. Jeg skal senere ta for meg skalering om et vilkårlig punkt.

 

 


 

 

Punkt kan også bli rotert en vinkel q om origo. Rotasjonen er definert matematisk ved:

.     (*)

Eller på matriseform:

 

R kalles rotasjonsmatrisen. På figuren har jeg vist rotasjon av en firkant. Legg merke til at firkanten også skifter posisjon.

 

 


La oss stoppe litt for å utlede likningene (*).

Fra figuren til venstre ser vi at når vi roterer fra P til P’ får vi følgende relasjoner for utgangspunktet:

og for resultatet får vi:

,

.

Substituerer vi de øverste inn i de nederste, får vi det ønskede resultatet (likningene (*)).

 

 

 

 

Nå har vi funnet de tre matrisene som står for translasjon, skalering og rotasjon. Vi oppdager følgende problem:

Vi vil gjerne behandle alle operasjoner likt, og kombinere disse på en enkel måte, nemlig matrisemultiplikasjon. Men translasjon blir gjort forskjellig fra rotasjon og skalering! Vi ville gjerne brukt matrisemultiplikasjon hele veien, men translasjon er en matrisesum.

 

Løsningen tok det lang tid før noen kom opp med. Men det skulle vise seg å bli å utvide det todimensjonale systemet til homogene koordinater. Altså å løfte planet opp i rommet. Homogene koordinater ble først utviklet i geometri, og har senere blitt mye brukt i datagrafikk. Poenget er vi utvider fra to til tre koordinater.

 

(w velges vanligvis lik 1, for å lette regningen.)

Dette vil i praksis si at et punkt har mange ulike homogene representasjoner, som på figuren til høyre (det kan ligge i flere plan):

 

 

 

 

 

 

 

Transformasjonen blir nå seende sånn ut:

Som vi ser, så har vi ved å utvide til 3-dimensjonalt koordinatsystem, fått alle transformasjonene til å ta form av matrise multiplikasjon. Transformasjonsmatrisene i 3D for skalering og rotasjon er tilsvarende henholdsvis:

 

.

 

Nå er vi stand til å utføre

 

Rotasjon en vinkel q om et vilkårlig punkt.

 

Dette gjøres nå i tre operasjoner:

1.      Translatere slik at punktet vi skal rotere om befinner seg i origo.

2.      Rotere

3.      Translatere slik at punktet i origo flyttes tilbake til punktet vi skulle rotere om.

 

 

Når vi nå har fått definert alle disse operasjonene som matrisemultiplikasjoner, er det bare å sette i gang å multiplisere ut. NB! Ved komponering av matrisemultiplikasjoner, må man starte med det man skal ha utført sist! Altså gange motsatt vei av hva man kanskje skulle tro var naturlig! På figurene over roterer jeg en firkant en vinkel q rundt sitt nedre venstre hjørne. Hvis vi ser på matrisemultiplikasjonene som trengs for å gjennomføre dette, må vi begynne med den siste, altså translatere fra origo og ut, så rotere en vinkel q, og så translatere fra punktet (nedre venstre hjørne av firkanten, som vi kaller x1,y1) og inn til origo. Komposisjonen blir som følger:

 

 

 

På samme måte kan vi skalere et punkt om et vilkårlig punkt, og også skalere og rotere simultant om et vilkårlig punkt.

 

Hvis vi skal tegne i 3D, gjør vi akkurat det samme, nemlig utvider med en fjerde koordinat.

Dette er altså de aller mest grunnleggende prinsipper for hvordan de enkleste funksjoner i et tegneprogram blir implementert.


Avslutning

 

Som vi ser, er det flere felt innen informasjonsteknologien at matematikk, både diskret og analytisk, kommer inn i bildet. Det aller største feltet er utvilsomt grafisk databehandling, og mange vil nok være enige om at det er det mest spennende feltet innenfor databehandling. Ved NTNU er det programmeringsspråket C, med et tillegg som heter SRGP (simple raster graphic package) som brukes under studentenes første møte med grafisk databehandling. SRGP er en samling funksjoner (for eksempel  å tegne et punkt i en bestemt farge, fylle en figur med en farge, tegne stjerne osv.) som studenter kan ta med i sine programmer for å lage et bilde. SRGP blir kun  brukt i opplæringsøyemed, men gjenspeiler de teknikker som man treffer på i virkelige situasjoner.

I tillegg til det jeg kom innpå i denne oppgaven (lineær algebra, polare og rektangulære koordinater i 2D og 3D) får man også ofte bruk for sylindriske koordinater, romvinkler, vektorregning (skalarprodukt, vektorprodukt), lineær algebra (invertering av matriser, determinanter, transponering), imaginære tall (til og med komplekse tall med tre imaginære deler), parametrisk representasjon av funksjoner, numeriske metoder, integralregning, gradienter m.m. Listen er lang.

Man kan jo spørre hva framtida vil bringe. En ting som det er forsket mye på, er hva vi egentlig kan gjøre enklere med datamaskiner enn uten. For eksempel; hvis det vil vise seg at en kirurg ved å benytte tilstrekkelig avansert datautstyr kan utføre vanskelig operasjoner i løse lufta, som så i virkeligheten blir utført av en datamaskin på den fysiske pasienten, er gunstig, så vil det nok bli slik. Vi har jo tatt denne teknikken i bruk allerede. Og hvis folk vil ha en 3D-representasjon av Molde-Rosenborg på sitt eget stuebord i stedet for å se kampen på Lerkendal eller på NRK, så vil det nok, når teknologien er blitt billig nok, og avansert nok, bli slik. For dette er ikke science fiction.

 

Vi har jo allerede sett den første 100% datamaskinkonstruerte tegnefilm. Filmen tok seks år og produsere. Videre er det ikke mange Hollywood-filmer som blir produsert uten innslag av datagrafikk. Et aktuelt eksempel er jo storfilmen Titanic, der store mengder av datagrafikk er benyttet, og nominert til mange Oscars for det. Bildet til venstre viser en scene fra filmen. Forhåpentligvis er det dette som vil forbli science fiction også i tiden framover…

 

 

 


 

 

Kilder

 

Introduction to computer graphics (Foley, Van Dam, Feiner, Hughes, Phillips)

Mathematics for computer graphics

Data structures and problem solving with Turbo Pascal (Carano, Helman, Veroff)

Forelesningsnotater om grafisk databehandling

 

I tillegg kan nok en del av dette finnes i Elementary Linear Algebra (Anton Rorres) i kapittelet om applications in computer graphics