Programmering av 3D-grafik för datorer med låg prestanda. Peter Halin

Storlek: px
Starta visningen från sidan:

Download "Programmering av 3D-grafik för datorer med låg prestanda. Peter Halin"

Transkript

1 Programmering av 3D-grafik för datorer med låg prestanda Peter Halin

2 Abstrakt Tredimensionell grafik har blivit vardagligt på allt från mobiltelefoner till hemdatorer. Fastän en allt större del av 3D-grafiken nuförtiden ritas med hjälp av sk. acceleratorkretsar, så finns det fortfarande situationer där detta inte är möjligt, t.ex. inbyggda system (embedded systems) som endast består av en centralprocessor och en simpel grafikkrets utan 3D-egenskaper. I detta fall är oftast processorn av låg prestanda, och det behövs rutiner som är snabba och tar så lite resurser som möjligt. I uppsatsen har jag koncentrerat mig på grunderna bakom matrisrotationer, linje- och polygonrutiner och sortering av ytor, samt lämpliga algoritmer för dessa. Som exempelspråk använder jag pseudokod, för att implementering på olika plattformer skulle vara möjligt. Exemplen är skrivna så att de inte tar resolutionen av skärmen i beaktande för att få dem tydligare, fastän en riktig implementation kunde ha en fastslagen resolution för maximal hastighet. Sökord: 3D-grafik, matrisrotation, optimering 2

3 1. Introduktion 4 2. Grunderna för 3D-programmering Fixedpoint aritmetik Matrisrotationer Perspektivkorrigering Minimering av ritandet Sortering Icke-synliga ytor Ritandet Trådmodeller Fyllda ytor Diskussion 25 3

4 1. Introduktion Tredimensionell grafik börjar bli allt populärare i all sorts mjukvara, speciellt efter att speciella 3d-acceleratorer börjat bli vanligare och kan åstadkomma nästan fotorealistiska bilder och animationer utan att belasta själva huvudprocessorn. Men fastän det finns 3dkretsar för de flesta ändamålen, är det ändå nödvändigt att få fram snabb 3d-grafik utan dem. I dessa fall faller allt arbete på huvudprocessorn, och då gäller det att mjukvaran också skall vara väl programmerad och snabb. Speciellt i t.ex. nöjeselektronik och motsvarande apparater där man har en liten skärm, så vill man ofta ha snabb grafik fastän det skulle vara på bekostnad av precision. Här behandlas de huvudområden som behövs för att få tredimensionella objekt att röra sig på skärmen. Kapitlet om grunderna för 3D-programmering behandlar aritmetik med fixedpoint-värden, matrisrotationer och perspektivkorrigering. Dessa räcker redan till att uppnå simpel och rörlig 3D-grafik, som består av punkter eller andra lättritade figurer. Till nästa behandlas sortering och icke-synliga ytor, vilka är förberedande skeden när man vill rita ut 3D-grafik med fyllda ytor. Med sorteringen ser man till att ytorna ritas i rätt ordning, och ger därmed en känsla av djup, medan man genom att slopa de ickesynliga ytorna snabbar upp ritandet, vilket i sin tur är den mest tidskrävande delen. Till slut behandlas själva ritandet, och metoder för att rita linjer och fyllda ytor tas upp. Och för att dessa är de mest tidskrävande behandlas dessa också mer djupgående än de andra områdena. Emedan de metoder som behandlas inte nödvändigtvis är de absolut snabbaste, så är de mycket bra kompromisser och är lätta att implementera, oberoende av plattform eller programmeringsspråk. Alla programexempel är skrivna i pseudokod, och är lätta att skriva om för de flesta programmeringsspråken, allt från assembler till högnivåspråk. 4

5 2. Grunderna för 3D-programmering 2.1 Fixedpoint-aritmetik För att få uträkningar snabbare på enkla processorer gäller det att hålla sig till heltalsuträkningar, men pga. att man behöver mera precision än så, behöver man göra uträkningar med decimaltal. Lättaste sättet skulle vara att använda flyttal, men dessa är långsamma i bruk ifall man inte har tillgång till en flyttalsprocessor, och man kan inte anta att en maskin innehåller en sådan. Så man behöver göra något för att komma runt detta problem. Ett bra alternativ är att använda sig av fixedpoint-värden [1], där man har ett heltal som representerar både heltalsdelen och decimaldelen av ett decimaltal. Om man använder 32-bitars tal så kan övre 16 bitarna representera heltalsdelen och lägre 16 bitarna decimaldelen, och detta kallas för fixedpoint-representation. Man kan också dela talet på andra sätt, som t.ex eller 12.20, beroende hurdan precision man behöver. Att dela ett 16-bitars tal i 8.8 format kan också komma i fråga när man inte behöver hög precision, och ifall processorn inte klarar av större tal. Uträkningarna gällande addition och subtraktion fungerar helt lika som med normala heltal, dvs. addition av två 16-bitars fixedpoint-tal ger ett 16-bitars fixedpoint-tal som resultat, som i följande exempel: 3F23h 3F.23h + 1F34h + 1F.34h = 5E57h = 5E.57h Samma gäller också vid subtraktion: 3F23h 3F.23h - 1F34h - 1F.34h = 1FEFh = 1F.EFh Man behöver också möjligheten att multiplicera och dividera vid olika uträkningar, men dessa är inte lika triviala som addition och multiplikation. 5

6 När man multiplicerar två faktorer med 32-bitars precision kommer produkten att vara ett 64-bitars tal, och i fallet av fixedpoint-värden kommer produkten att ha en precision på En 32-bitars produkt får man genom att slopa de 16 högsta och de 16 lägsta bitarna, vilket resulterar i ett 32-bitars, eller fixedpoint tal. I detta skede måste man också kolla efter overflow, och då hantera det på lämpligt sätt. Och ifall man använder 16-bitars tal blir resultatet ett 32-bitars tal, enligt följande exempel: 0F69h 0F.69h x 1070h x 10.70h 00FD4DF0h 00FD.4DF0h -> FD.4Eh Ett annat problem som kan uppstå vid multiplikation är att alla arkitekturer inte stöder 64- bitars resultat vid multiplicering av två 32-bitars tal, och i detta fall måste man spjälka upp talet i mindre bitar. Ett behändigt sätt är att dela upp båda talen i fyra 16-bitars delar, och sedan multiplicera dem med varandra, och använda dessa produkter för att bygga ihop det slutliga talet. I exemplet används två 16-bitars tal: 69h x 70h = 2DF0h -> 002Dh 002D h 0Fh x 70h = 0690h -> 0690h h 69h x 10h = 0690h -> 0690h h 0Fh x 10h = 00F0h -> F000h + F000 h FD4D h I exemplet tar man och multiplicerar de olika 8-bitars värden, och använder de olika 16- bitars värden för att åstadkomma det slutliga 16-bitars talet. Första talet måste skiftas åtta bitar åt höger för att man inte vill ta de lägsta 8 bitarna i beaktande, och det sista talet skiftas åtta bitar åt vänster för att man inte heller behöver då 8 högsta bitarna. Detta leder till att alla talen ryms i 16 bitar, och man kan addera dem. Det blir ett litet avrundningsfel i decimaldelen i detta fall, pga. av att när man skiftar tal så blir det avrundade neråt. Detta kan korrigeras med att addera till 80h till tal som skiftas med 8 (och 8000h ifall man skulle hantera 32-bitars tal, vilka i sin tur skulle skiftas 16 steg). 2DF0h h = 2E70h -> 002Eh 002Eh h h + F000h = FD4Eh 6

7 Speciellt när man räknar med 32-bitars tal brukar dessa avrundningsfel inte vara av stort värde, men dessa kan ju bli större ifall man behöver göra flere uträkningar där man utgår från de föregående talen. Precis som i multiplikationen så kan man inte dividera två fixedpoint värden och få ett resultat av samma precision. Det som händer då man dividerar dessa två är att man får ett heltal som resultat, och medan man inte behöver dividera två decimaltal med ett decimaltal som resultat under flesta omständigheter, så kan det ändå behövas. Lösningen till detta är att man förlänger täljaren till ett 64-bitars värde i precision (eller 32- bitars med precision ifall man använder sig av 16-bitars värden), och behåller nämnaren i sin ursprungliga form. Kvoten man får kommer då att vara i det önskade formatet. Man kommer också att behöva dividera två heltal med ett decimaltal som resultat, och då förlänger man täljaren till ett fixedpoint tal och dividerar. Exemplet visar division med två 16-bitars tal, och division med täljaren förlängd till 32 bitar: 3F15h = 0001h (endast heltalsdelen) 23EAh 003F1500h = 01C1h (med decimaldel) 23EAh Medan ett möjligt problem i multiplikationen var att produkten blir ett 64-bitars tal, medan man endast kan hantera 32-bitars värden, så är problemet i division att täljaren har 64 bitar, och man måste få utfört uträkningarna med 32-bitars register eller variabler. Men pga. att denna precision inte är nödvändig i normalt bruk så kommer metoder för att lösa detta inte tas upp. Ifall man behöver ett decimalvärde så kan man skifta nämnaren åt höger med 8 bitar, så man får ett 8.8 fixedpoint-värde, och dividera täljaren med denna. Svaret blir då ett tal med 8.8 precision, vilket kan förlängas till Ifall man endast är intresserad av heltalsdelen, vilket kommer att vara aktuellt i perspektivkorrigeringen, så tar man och dividerar båda fixedpoint-talen med varandra. 7

8 2.2 Matrisrotationer Matrisrotationer [2] är centrala i uträkningen av tredimensionella världar. Det används för att roterar objekt runt sin mittpunkt (eller annan punkt), och för att rikta kameran i scenen. Här tas endast upp hur man roterar objektets punkter runt sin mittpunkt, men samma metoder kan också användas för rotationen av kameran. För rotation av en punkt runt de olika axlarna använder man följande matriser (där cx står för cos(x) och sx för sin(x) osv.): x-axeln cx sx 0 0 -sx cx y-axeln cy 0 -sy sy 0 cy z-axeln cz sz 0 0 -sz cz När man implementerar denna är man inte intresserad av sista kolumnen eller sista raden, utan det är 3x3 matrisen i övre vänstra hörnet som är den intressanta. Vill man rotera en punkt runt alla axlar så roterar man punkten först runt x-axeln, sedan y-axeln och sedan ännu z-axeln. Exempelprogrammet för detta skulle se ut som följande: x_1 = orig_x; y_1 = orig_y * cos(x_rot) + orig_z * sin(x_rot); z_1 = -orig_y * sin(x_rot) + orig_z * cos(x_rot); x_2 = x_1 * cos(y_rot) z_1 * sin(y_rot); y_2 = y_1; z_2 = x_1 * sin(y_rot) + z_1 * cos(y_rot); new_x = x_2 * cos(z_rot) + y_2 * sin(z_rot); new_y = -x_2 * sin(z_rot) + y_2 * cos(z_rot); new_z = z_2; Med denna programkod har man roterat punkterna orig_x, orig_y och orig_z runt alla tre axlarna, och nya koordinaterna finns i new_x, new_y och new_z. Detta är dock inte det mest optimala sättet att rotera, för nu behövs det 12 multiplikationer för varje punkt, vilket kräver en hel del processortid ifall man roterar en stor mängd punkter. Detta kan 8

9 lösas med att slå ihop dessa rotationer och förenkla dem. Först slår man ihop roteringarna runt x- och y-axeln: sx = sin(x_rot); cx = cos(x_rot); sy = sin(y_rot); cy = cos(y_rot); x_2 = orig_x * cy (-orig_y * sx + orig_z * cx) * sy; y_2 = orig_y * cx + orig_z * sx; z_2 = orig_x * sy + (-orig_y * sx + orig_z * cx) * cy; Vilket i sin tur kan förenklas till: x_2 = orig_x * cy + orig_y * sx * sy - orig_z * cx * sy; y_2 = orig_y * cx + orig_z * sx; z_2 = orig_x * sy - orig_y * sx * cy + orig_z * cx * cy; Efter detta slår man samman och förenklar de sista raderna. I detta skede är det också behändigt att spara de roterade värdena i en två-dimensionell tabell, för att sedan kunna användas om igen för varje punkt man vill rotera: matrix[0][0] = cy * cz; matrix[1][0] = sx * sy * cz cx * sz; matrix[2][0] = cx * sy * cz + sx * sz; matrix[0][1] = cy * sz; matrix[1][1] = sx * sy * sz + cx * cz; matrix[2][1] = cx * sy * sz + sx * cz; matrix[0][1] = -sy; matrix[1][1] = sx * cy; matrix[2][1] = cx * cy; new_x = orig_x * matrix[0][0] + orig_y * matrix[1][0] + orig_z * matrix[2][0]; new_y = orig_x * matrix[0][1] + orig_y * matrix[1][1] + orig_z * matrix[2][1]; new_z = orig_x * matrix[0][2] + orig_y * matrix[1][2] + orig_z * matrix[2][2]; Beroende på hur hög precision man vill ha, och också beroende på vilket språk man skriver i, så kan man först räkna alla värden i rotationstabellen som flyttal och sedan räkna om dem till fixedpoint decimaltal. Detta görs endast en gång per beräknad bild, så hastigheten drabbas mycket minimalt av detta. Ifall minnet tillåter kan man räkna ut en färdig sinustabell i fixedpoint format, och använda detta för att räkna ut rotationstabellen. Denna metod är att föredra ifall man programmerar i assembler. 9

10 2.3 Perspektivkorrigering Fastän alla uträkningar sker i tre dimensioner så har en skärm endast två, och detta leder till att man måste korrigera de tredimensionella värdena till två dimensioner. Lättaste och snabbaste sättet är parallellprojektion [3], som går ut på att slopa z-värdet, och endast multiplicera x- och y-värden med en lämplig konstant och därmed använda heltalsdelen för ritandet. Emedan detta är ett snabbt sätt så ser det man ritar förvrängt ut, pga. att man inte får något djup i bilden. Utan perspektiv Med perspektiv För att representera en tredimensionell värld måste man perspektivkorrigera [4] punkterna, dvs. ta z-värdet i beaktande på det sätt att objekt som är längre bort från tittaren ser mindre ut än de som är närmare. Detta gör man genom att dividerar både x- och y-värdet med z-värdet, och därmed får ett perspektivkorrigerat värde. Och eftersom koordinatsystemet har y-axeln i motsatt riktning jämfört med en skärm, så brukar man ändra tecknet på y-värdet före divisionen. korr_x = x / z korr_y = -y / z Man måste också se till att z inte är 0 för detta skulle resultera i en division-by-zero, vilket oftast leder till att programmet kraschar. Eftersom resultatet skall bli ett heltal, kan man dividera de båda decimaltalen rakt med varandra, men pga. att talen oftast inte är stora så brukar man multiplicera x- och y-värden med en konstant. korr_x = (k * x) / z korr_y = -(k * y) / z 10

11 När man använder sig av en låg resolution, som 320x200, brukar 256 vara ett lämpligt värde för konstanten. Detta värde är också lämpligt med tanke på uträkningarna, med tanke på att man istället för att multiplicera kan man skifta bitarna åt vänster med 8 steg. korr_x = (x << 8) / z korr_y = -(y << 8) / z Beroende på hur nära tittaren man vill att punkterna skall vara så kan man addera en konstant till z-värdet före divisionen. Desto större värde man adderar med, desto längre borta från tittaren verkar punkterna vara. korr_x = (x << 8) / (z + avstand) korr_y = -(y << 8) / (z + avstand) Efter detta är mittpunkten fortfarande i origo, dvs. (0,0), och på en skärm är detta i övre vänstra hörnet. Beroende på var på rutan man vill att mittpunkten skall finnas, så adderar man konstanter till både nya x- och y-värden. korr_x = (x << 8) / (z + avstand) + mitt_x korr_y = -(y << 8) / (z + avstand) + mitt_y Ett sätt att snabba upp perspektivkorrigeringen är att i förväg räkna ut två tvådimensionella tabeller som innehåller de korrigerade värden med hänsyn till x/z och y/z. Dessa tabeller äter dock upp en hel del minne, och är därför användbara endast ifall man använder små resolutioner och ändå har mycket minne till sitt förfogande. Och korrigeringen är en mycket lite del av hela processen i räknandet av en bild, så det lönar sig nödvändigtvis inte att slösa minne för att snabba upp just denna del av räknandet. 11

12 3. Minimering av ritandet 3.1 Sortering Efter att man räknat ut alla punkter som skall användas för ritandet av ytorna bör man göra en del förberedelser. En av de viktigaste är sorteringen av ytorna, pga. att man måste rita ut ytorna i rätt ordning, dvs. från den som är längst bort till den som är närmast. I detta skede av uträkningarna kan man också kolla ifall ytan råkar komma bakom kameran, dvs. ifall ytan är bakom den punkten från vilken man ser på den tredimensionella världen. Dessa ytor kan man helt enkelt slopa, och inte ta i beaktande i de följande stegen. Vad normal sortering dock inte tar i beaktande är att ytor kan gå igenom varandra, men ifall man planerar sin 3D-värld bra så kan man minimera detta. En lösning för problemet skulle vara att använda z-buffering [5], vilket går ut på att man har en skild tabell som innehåller ett z-värde för varje pixel, och att man interpolerar z-värdet för varje pixel man ritar och kollar ifall den är större än förra värdet på samma pixel. Ifall värdet är större så ritar man ut pixeln och uppdaterar tabellen, annars låter man bli. Detta är en bra metod som alla 3D-acceleratorchip använder, men är mycket långsam att implementera i mjukvara på en långsam processor. Emedan quicksort [6] är en populär algoritm för sortering, så passar sig radixsort [7], uppfunnen av Harold H. Seward år 1954, bättre för detta ändamål. Radixsort passar bra för att sortera värden av en bestämd precision, vilket i detta fall är 32-bitar. Att värden är fixedpoint decimaltal behöver man inte ta i beaktande, men de negativa talen måste fås positiva, och detta kan åstadkomma genom att addera h till varje tal, vilket gör att talen sträcker sig från 0h till FFFFFFFFh istället för från h till 7FFFFFFFFh. Implementeringen av radixsort är också lättare i assembler än quicksort, vilken är en rekursiv algoritm. Den enda negativa sidan i radixsort är att den kräver dubbelt så mycket minne som man har ytor att sortera. 12

13 Radixsort går ut på att man sorterar räckan av tal i flere olika steg, t.ex. som i detta fall enligt varje byte i talet börjande med det lägsta och slutande med det högsta. Det är viktigt att behålla ordningen på de tal vilka har samma värden i den sorterade byten, för annars blir resultatet fel. Man kan använda länkade listor för de sorterade värden, men användningen av tabeller är snabbare, speciellt när man programmerar i assembler. I följande exempel sorteras talen enligt varje tal av basen 10 istället för varje byte: Ursprungliga ordningen av talen: Efter första omgången: Efter andra omgången: Efter tredje omgången: Efter fjärde omgången: Metoden att använda radixsort med tabeller går ut på att man har två tabeller av samma storlek, och en indextabell där storleken bestäms av enligt hur stora tal man sorterar med, vilket i detta fall är 256, dvs. storleken av värden i en bytes precision. Man börjar med att gå igenom de lägsta bytes i de värden som skall sorteras, och i detta fall gäller det medeltalet punkternas z-värden i varje yta. Varje värde används som index i indextabellen, för att inkrementera värdet på det element indexet pekar på. På detta sätt får man veta hur många det finns av varje tal som skall sorteras. Efter detta fixar man indextabellen så att varje element är summan av de föregående värdena. Sedan går man igenom tabellen som skall sorteras med hjälp av dessa indexvärden så att man använder indexvärden som index när man flyttar talen till den temporära tabellen. Efter varje tal som flyttas inkrementerar man värdet i indextabellen. Denna process görs sedan om för varje byte i talen, och med 32-bitars tal blir det allt som allt fyra gånger. När talen är sorterade så kan man ännu ta och svänga om räckan med talen för att få räckan i en fallande ordning, dvs. de ytor som är längst bort kommer först i räckan. 13

14 Följande exempel är i pseudokod, och är lätt att implementera i flesta olika programmeringsspråk: ; Tömmer indexräckan for (i = 0; i < 256; i++) { index[i] = 0; ; går igenom varje tal och inkrementerar rätta värdet i ; indexräckan for (i = 0; i < amount_of_faces; i++) { new_index = z_values[face_index[i]] and 255; index[new_index] = index[new_index] + 1; ; går igenom indexräckan och ändrar värden så att varje element ; i räckan motsvarar summan av de föregående elementen sum_index = index[i]; index[i] = 0; for (i = 1; i < 256; i++) { curr_index = index[i] index[i] = sum_index; sum_index = sum_index + curr_index; ; flyttar över talen från ursprungliga räckan med indexräckan ; som index för varje element for (i = 0; i < amount_of_face; i++) { new_index = z_values[face_index[i]] and 255; temp_index[index[new_index]] = face_index[i]; index[new_index] = index[new_index] + 1; Föregående pseudokod var ett exempel på hur en omgång i sorteringen går till, och den måste i detta fall göras fyra gånger, dock med den skillnaden att raderna som definierar new_index skall varje gång motsvara den byte man vill sortera enligt. Med 32-bitars tal skall de se ut enligt följande: Första omgången: new_index = z_values[face_index[i]] and 255; Andra omgången: new_index = (z_values[face_index[i]] >> 8) and 255; osv. I exemplet finns också en räcka z_values, som man har räknat ut i förväg, och som innehåller medeltalet av z-värden för varje punkt i en yta. 14

15 3.2 Icke-synliga ytor Som redan nämndes vid sorteringen så skall man inte ta i beaktande de ytor som skulle komma bakom kameran eller åskådaren. Men så länge man inte har transparenta ytor, så finns det också en hel del ytor som inte behöver ritas ut, dvs. de ytor som är riktade bort från åskådaren. Genom att slopa dessa ytor slipper man ofta av med nästan hälften av ytorna, och med tanke på att det är ritandet av ytorna som tar mest tid så sparar man en massa tid och gör ritandet mycket snabbare. Före man börjar rita bör man också se efter ifall ytorna hamnar delvis eller helt utanför den synliga rutan. Ifall ytan blir helt utanför så kan man slopa den, men ifall den är delvis utanför så måste man ta och klippa den enligt kanterna. Detta kan implementeras i själva ritrutinen, eller alternativ ändrar man om triangeln till en fyrhörning (eller flerhörning) beroende på hur mycket av ytan hamnar utanför. För att kunna veta vilka ytor är riktade bort från åskådaren använder man en metod som kallas för backface culling [8]. Detta går i sin enklaste form ut på att man räknar ut kryssprodukten för en yta och beaktar ifall den är negativ eller inte. Ifall kryssprodukten är positiv så ritar man ut ytan, och ifall den är negativ så pekar ytan åt fel håll och den ritas inte ut. Denna metod fungerar endast ifall punkterna för varje yta är definierade i 15

16 motsols riktning. Följande exempel i pseudokod antar att man använder perspektivkorrigerade värden, och returnerar TRUE ifall ytan är synlig och FALSE ifall den inte är det: BackfaceCull(x1, y1, x2, y2, x3, y3) { if ((x3 x1) * (y3 - y2) (x3 x2) * (y3 y1)) > 0 return TRUE else return FALSE; Detta kan också demonstreras med figuren nedan, där den första triangeln skulle vara synlig, medan den andra inte skulle vara det: Ifall den bild man ritar ut innehåller många ytor så kan det vara behändigt att göra backface culling före man sorterar ytorna, för då sorterar man inte i onödan ytor som ändå inte ritas ut. Detta kan implementeras genom att gå igenom alla ytor och göra en tabell med endast de ytor som är synliga, och vilka sedan sorteras. j = 0; for (i = 0; i < amount_of_faces; i++) { curr_face = face_index[i] * 3; nx1 = x_points[faces[curr_face]]; nx2 = x_points[faces[curr_face + 1]]; nx3 = x_points[faces[curr_face + 2]]; ny1 = y_points[faces[curr_face]]; ny2 = y_points[faces[curr_face + 1]]; ny3 = y_points[faces[curr_face + 2]]; if BackfaceCull(nx1, ny1, nx2, ny2, nx3, ny3) { new_face_index[j] = face_index[i]; j = j + 1; amount_of_new_faces = j; 16

17 I exemplet ovan innehåller face_index-tabellen indexet för de tre efter varandra liggande värden i faces-tabellen vilka bygger upp en triangel, dvs. en yta. Dessa tre värden används sedan som index för x_points- och y_points-tabellerna, vilka innehåller de perspektivkorrigerade x- och y-koordinaterna. Idén med att ha allt detta i egna tabeller är att man inte behöver ändra på värden i t.ex. faces-tabellen, utan endast ändrar på indextabellens värden. 17

18 4. Ritandet 4.1 Trådmodeller För att få en enkel visuell bild av det som man tidigare räknat ut så kan man använda sig av trådmodeller (wireframe-models). Eftersom hela den scenen man räknat ut består av trianglar i detta fall, så kan man med en simpel linjerutin rita konturerna av varje triangel. Med detta kan man få ett bra grepp om hur den tredimensionella världen ser ut vid olika tidpunkter, och detta är också ett snabbt sätt att rita. En negativ sida är dock att pga. att man inte fyller ytorna så ser man igenom varje föremål i den uträknade världen. En vanlig linjerutin går ut på att man ritar en linje mellan två punkter på det tvådimensionella planet. Hur det detta går till beror på skillnaden mellan avstånden på x- och y-ledet. Ifall linjen är längre på x-ledet så räknar man ut en ny y-koordinat för varje steg på x-axeln, och är y-ledet längre så räknar man y-koordinater enligt stegen på x- axeln. Detta för att linjen inte skall få några springor, som i exemplet nedan, där den vänstra linjen är räknad med hänsyn till x-axeln och den högra med hänsyn till y-axeln: En av de mest populära linjealgoritmerna är Bresenhams algoritm [9], vilken passar bra för detta ändamål, för att den i sin optimerade form endast behöver additioner och subtraktioner med heltal för att rita linjer. Algoritmen går ut på att man tar i beaktande det faktum att ifall man ritar en linje från vänster till höger längs med x-axeln och uppifrån neråt på y-axeln, så har varje nya punkt endast två alternativ, den är antingen (x+1,y) eller (x+1,y+1). Man bestämmer ifall man adderar 1 till y genom att räkna ut absolutbeloppet för skillnaden mellan de två olika x-värden och de två olika y-värden, och sedan dividera dessa för att ge linjens sluttning. Efter varje steg adderar man 18

19 sluttningen till en fri variabel som är mellan 0 och 1, och ifall denna variabel är större än 0.5 så adderar man 1 till y. Exempelprogrammet skulle se ut som följande: DrawLine(x1, y1, x2, y2) { // räknar ut skillnaden för x och y värden delta_x = abs(x2 x1); delta_y = abs(y2 y1); var = 0; // räknar ut sluttningen slope = delta_y / delta_x; y = y1; for (x=x1; x < x2; x++) { put_pixel(x,y,1); var = var + slope; if (var > 0.5) { y = y + 1; // för att hålla var mellan 0 och 1 var = var 1; Problemet med denna lösning är att det behövs decimaltal för att representera både var och slope variablerna. Detta kan lösas med att multiplicera alla decimaltal med delta_x, för att då kunna använda endast heltal. I jämförelsen av var med 0.5 kan man multiplicera båda sidorna med 2, för att helt slippa av med decimaltalen. Nya lösningen ser ut som följande: DrawLine(x1, y1, x2, y2) { delta_x = abs(x2 x1); delta_y = abs(y2 y1); var = 0; slope = delta_y; y = y1; for (x=x1; x < x2; x++) { put_pixel(x,y,1); var = var + slope; if ((var << 1) > delta_x) { y = y + 1; var = var delta_x; 19

20 Efter detta behöver man endast skriva om programkoden så att den tar de olika vinklarna i beaktande. Ifall delta_y är större än delta_x behöver man endast svänga om de två deltan och x- och y-koordinaterna. Sedan måste man ta i beaktande ifall x2 är mindre än x1, eller y2 mindre än y1, i vilka fall man måste subtrahera 1 från y-koordinaten ifall man ritar längs med x-axeln, eller tvärtom. 20

21 4.2 Fyllda ytor För att få 3D-bilder att se intressantare ut än trådmodeller, så måste man ta och fylla trianglarna som scenen består av. Det finns flere olika alternativ till hur man vill fylla trianglarna, vilket sedan påverkar på både utseende och hastighet. Som tumregel kan man ha att desto finare man vill att allt ser ut, desto långsammare blir utritandet. Lättaste att implementera är en simpel flat-fill [10], vilket betyder att man fyller ytorna med en färg. Redan med detta får man till stånd mycket intressantare och livligare bilder än med endast trådmodeller. Trådmodell Modell med fyllda ytor Att rita en triangel går ut på att man har tre punkter a, b och c, som i exempelbilden nedan. Idén är då att man räknar ut vinkeln för linjerna ab, ac och bc, och hjälp av dessa fyller man triangeln uppifrån neråt [4]. Det är alltså viktigt att punkterna är sorterade, dvs. att a är översta, b är mittersta och c är nedersta hörnet i triangeln. Ritandet delas i två delar, först ritar man från a till b på y- ledet, och i andra skedet från b till c. I första skedet räknar man ut nya x-koordinater för 21

22 både ab och ac för varje steg på y-ledet, och drar ett streck mellan dessa punkter, sedan när man nått b börjar man räkna x-värdet för bc istället för ac och fortsätter tills man nått punkten c. Implementationen i sin enklaste form går ut på att man räknar sluttningarna för ab, ac och bc, dvs. man interpolerar x-värdet från xa till xb i (yb-ya) antal steg. Om man antar att punkterna redan är sorterade enligt höjden, som i figuren ovan, ser exempelprogrammet ut enligt följande: ; första delen av triangeln, från a till b på y-ledet for (y = ya; y < yb; y++) { x1 = (y ya) * ((xb xa) / (yb ya)) + xa; x2 = (y ya) * ((xa xc) / (ya yc)) + xa; draw_line(x1, y, x2, y, color); ; andra delen av triangeln, från b till c på y-ledet for (y = yb; y < yc; y++) { x1 = (y ya) * ((xb xc) / (yb yc)) + xb; x2 = (y ya) * ((xa xc) / (ya yc)) + xa; draw_line(x1, y, x2, y, color); Exemplet ovan är långt ifrån den mest optimala lösningen, men demonstrerar bra hur man ritar en triangel på skärmen. Idén med att dela ritandet i två delar är att man lätt kan ta specialfall i beaktande. Ifall både yb och yc skulle råka vara lika, så skulle man endast behöva gå igenom första delen av rutinen, och ifall ya och yb är lika så räcker kan man hoppa över första delen och börja från den andra. 22

23 Fastän exemplet är fungerande, så är det långt ifrån att vara snabb. Ett stort problem är att man gör två multiplikationer för varje steg på y-ledet för att interpolera x-värdet. En lösning är att använda fixedpoint tal istället för flyttal, men detta snabbar inte upp räknandet tillräckligt ändå. Funktionen för interpolering av t.ex. 4 till 9 i åtta steg är enligt följande: f(x) = 4 + x * ((9 4) / 8) Funktionen kan generaliseras som: f(x) = A + x * ((B A) / antalet_steg) Man kan nu märka att ((B A) / antalet_steg) är konstant för varje steg, och att man då kunde skriva om den så att man börjar med A och för varje steg adderar till denna konstant. På detta sätt slipper man av med en multiplikation, en division och en subtraktion för varje steg, vilket snabbar upp räknandet, speciellt med tanke på att dessa uträkningar görs otaliga gånger under ritandet av en bild. Detta kan då utnyttjas i exempelprogrammet, vilken efter förändringarna skulle se ut som följande: ; räknar ut konstanterna för sluttningarna, förlänger täljaren ; till ett 32-bitars fixedpoint decimaltal, medan nämnaren hålls ; som ett 16-bitars heltal och kvoten fås då i 32-bitars ; fixedpoint format. slope_ab = ((xb xa) << 16) / (yb ya); slope_ac = ((xa xc) << 16) / (ya yc); slope_bc = ((xb xc) << 16) / (yb yc); ; första delen av triangeln, från a till b på y-ledet x1 = xa << 16; x2 = xa << 16; for (y = ya; y < yb; y++) { draw_line(x1 >> 16, y, x2 >> 16, y, color); x1 = x1 + slope_ab; x2 = x2 + slope_ac; ; andra delen av triangeln, från b till c på y-ledet x1 = xb << 16; for (y = yb; y < yc; y++) { draw_line(x1 >> 16, y, x2 >> 16, y, color); x1 = x1 + slope_bc; x2 = x2 + slope_ac; 23

24 I detta exempel har man nu endast två additioner per y-koordinat, istället för att utföra två divisioner, två multiplikationer, två additioner och flertal subtraktioner. Vad exemplet fortfarande inte tar i beaktande är ifall hörnen av triangeln är utanför rutan, men dessa är triviala att implementera. Lättaste sättet på x-ledet är att i draw_line-funktionen kolla ifall x-koordinaterna är utanför skärmens kanter, och i så fall endast rita den synliga delen. På y-ledet gäller samma sak, dvs. man kollar ifall punkterna hamnar utanför det synliga området och börjar rita från de första koordinaterna som är synliga. Också om draw_line-funktionen är implementerad så att det ritar punkterna från vänster till höger så måste man kolla vilkendera x-koordinaten är mindre och vilken större. Detta kan dock implementeras in i själva ritfunktion eller alternativt väljer man x1 och x2 enligt vilkendera är på vänstra sidan. Speciellt om man programmerar på assemblernivå, och man ritar med 8-bitars färgrymd så kan linjeritandet optimeras så att man fyller fyra pixlar med en instruktion genom att kopiera med 32-bitars register då det är möjligt. Att optimera inre loopen som sköter om ritandet av linjen är också den som lönar sig att optimera bäst, speciellt när det gäller gouraudshading och texturemapping, då man inte endast skriver pixlar i minnet, utan också är tvungen att utföra beräkningar för varje pixel som ritas. Om man behöver inkludera klippandet av kanterna i sin triangelrutin kan man också snabba upp ritandet med att ha två olika versioner av ritrutinen, en som inte tar klippning i beaktande och en som gör det. Då kan man före ritandet kolla ifall ytan hamnar delvis utanför rutan och då kalla på rutinen med klippning och i andra fall på den normala rutinen. Detta snabbar upp ritandet en del pga. att en rutin som inte tar klippning i beaktande är snabbare, och flesta trianglar hamnar ändå inte delvis utanför rutan. Fastän man är tvungen att göra några överlopps jämförelser för punkterna, så är det ändå förmånligare än att använda klippande rutinen för varje yta. 24

25 5. Diskussion Efter att man har implementerat matrisrotationer, perspektivkorrigering, sortering, ritrutinerna och de olika formerna för att minimera ritandet, har man redan grunderna för att bygga upp en fullständig 3D-motor. Något som inte ännu tagits upp är olika sätt att fylla ytor, beaktande av ljuskällor, kamera för olika kameravinklar och dylikt. Medan flesta av dessa är lätta att implementera, är de svårare att optimera väl för att fungera på svagare datorer. Speciellt i olika metoder att fylla ytor kan man behöva gå ner på assemblernivå för att få de bästa resultaten, genom att optimera för den processorfamilj och specifik processormodell man programmerar för. Man kan också konstatera att ifall man faktiskt behöver bra prestanda och precision, fastän man använder en svagare processor, så kan det vara lämpigare att utnyttja ett 3Dacceleratorchip istället för att spendera tid på att optimera alla rutiner till fullo. Att få allt att löpa smidigt med endast mjukvara kan vara tidsmässigt krävande, och ofta inte värt mödan. Vilket ändå inte betyder att man skall programmera slarvigt och använda dåliga algoritmer, för ifall man väljer fel algoritm är det omöjligt att få implementation snabb oberoende hur mycket man än försöker optimera. Det är först efter att man vält rätt algoritm och lösning för rätt ändamål som man skall behöva gå på låg nivå och optimera själva programkoden. 25

26 Litteraturförteckning 1. Fixed-point arithmetic, Wikipedia, ändrat , Data Structures for Game Programmers, Ron Penton, Computer Graphics, C-version (2nd Edition), s , Donald Hearn, Computer Graphics, C-version (2nd Edition), s , Donald Hearn, Computer Graphics, C-version (2nd Edition), s , Donald Hearn, Quicksort, Wikipedia, ändrat , D Game Engine Architecture, David H. Eberly, Dica, Ilkka Peltonen & Kaj Mikael Björklund, kap 6.1, ändrat mars 1998, Computer Graphics, C-version (2nd Edition), s.88-92, Donald Hearn, Dica, Ilkka Peltonen & Kaj Mikael Björklund, kap 3.1, ändrat mars 1998,

Kvalificeringstävling den 30 september 2008

Kvalificeringstävling den 30 september 2008 SKOLORNAS MATEMATIKTÄVLING Svenska Matematikersamfundet Kvalificeringstävling den 30 september 2008 Förslag till lösningar Problem 1 Tre rader med tal är skrivna på ett papper Varje rad innehåller tre

Läs mer

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet Algoritmer, datastrukturer och komplexitet Övning 6 Anton Grensjö grensjo@csc.kth.se 9 oktober 2015 Anton Grensjö ADK Övning 6 9 oktober 2015 1 / 23 Översikt Kursplanering Ö5: Grafalgoritmer och undre

Läs mer

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet Algoritmer, datastrukturer och komplexitet Övning 6 Anton Grensjö grensjo@csc.kth.se 4 oktober 2017 1 Idag Algoritmkonstruktion (lite blandat) Redovisning och inlämning av labbteori 3 2 Uppgifter Uppgift

Läs mer

Tema: Pythagoras sats. Linnéa Utterström & Malin Öberg

Tema: Pythagoras sats. Linnéa Utterström & Malin Öberg Tema: Pythagoras sats Linnéa Utterström & Malin Öberg Innehåll: Introduktion till Pythagoras sats! 3 Pythagoras sats! 4 Variabler! 5 Potenser! 5 Att komma tillbaka till ursprunget! 7 Vi bevisar Pythagoras

Läs mer

Konvexa höljet Laboration 6 GruDat, DD1344

Konvexa höljet Laboration 6 GruDat, DD1344 Konvexa höljet Laboration 6 GruDat, DD1344 Örjan Ekeberg 10 december 2008 Målsättning Denna laboration ska ge dig övning i att implementera en algoritm utgående från en beskrivning av algoritmen. Du ska

Läs mer

Föreläsning 8: Aritmetik och stora heltal

Föreläsning 8: Aritmetik och stora heltal 2D1458, Problemlösning och programmering under press Föreläsning 8: Aritmetik och stora heltal Datum: 2006-11-06 Skribent(er): Elias Freider och Ulf Lundström Föreläsare: Per Austrin Den här föreläsningen

Läs mer

Rumsuppfattning är förmågan att behandla sinnesintryck av former

Rumsuppfattning är förmågan att behandla sinnesintryck av former Güner Ahmet & Thomas Lingefjärd Tredimensionellt tänkande Tredimensionella matematiska representationer är inte särskilt vanliga i skolans matematikkurser, med undantag för kurs 3 5 i gymnasiet. Varför

Läs mer

9-1 Koordinatsystem och funktioner. Namn:

9-1 Koordinatsystem och funktioner. Namn: 9- Koordinatsystem och funktioner. Namn: Inledning I det här kapitlet skall du lära dig vad ett koordinatsystem är och vilka egenskaper det har. I ett koordinatsystem kan man representera matematiska funktioner

Läs mer

Sammanfattningar Matematikboken X

Sammanfattningar Matematikboken X Sammanfattningar Matematikboken X KAPITEL 1 TAL OCH RÄKNING Naturliga tal Med naturliga tal menas talen 0, 1,,, Jämna tal 0,,, 6, 8 Udda tal 1,,, 7 Tallinje Koordinater En tallinje kan t ex användas för

Läs mer

Föreläsning 11: Beräkningsgeometri

Föreläsning 11: Beräkningsgeometri DD2458, Problemlösning och programmering under press Föreläsning 11: Beräkningsgeometri Datum: 2009-11-24 Skribenter: David Björklund, Christoer Lundell Johansson och Mårten Selin Föreläsare: Fredrik Niemelä

Läs mer

Att förstå bråk och decimaltal

Att förstå bråk och decimaltal Att förstå bråk och decimaltal Flera undersökningar som är gjorda visar att elever har svårt att förstå bråk. I undervisningen är det också vanligt att eleverna lär sig olika regler för bråk, men få förstår

Läs mer

Institutionen för matematik och datavetenskap Karlstads universitet. GeoGebra. ett digitalt verktyg för framtidens matematikundervisning

Institutionen för matematik och datavetenskap Karlstads universitet. GeoGebra. ett digitalt verktyg för framtidens matematikundervisning Karlstads GeoGebrainstitut Institutionen för matematik och datavetenskap Karlstads universitet Mats Brunström Maria Fahlgren GeoGebra ett digitalt verktyg för framtidens matematikundervisning Invigning

Läs mer

Matematiska uppgifter

Matematiska uppgifter Elementa Årgång 67, 984 Årgång 67, 984 Första häftet 3340. a) Vilket av talen A = 984( + + 3 + + 984 ) är störst? b) Vilket av talen B 3 = 3 + 3 + 3 3 + + 984 3 är störst? A / = 984( + + 3 + + 984) B =

Läs mer

Grafisk Teknik. Rastrering. Övningar med lösningar/svar. Sasan Gooran (HT 2013)

Grafisk Teknik. Rastrering. Övningar med lösningar/svar. Sasan Gooran (HT 2013) Grafisk Teknik Rastrering Övningar med lösningar/svar Det här lilla häftet innehåller ett antal räkneuppgifter med svar och i vissa fall med fullständiga lösningar. Uppgifterna är för det mesta hämtade

Läs mer

Ordlista 5A:1. term. faktor. täljare. nämnare. Dessa ord ska du träna. Öva orden

Ordlista 5A:1. term. faktor. täljare. nämnare. Dessa ord ska du träna. Öva orden Ordlista 5A:1 Öva orden Dessa ord ska du träna term Talen som du räknar med i en addition eller subtraktion kallas termer. faktor Talen som du räknar med i en multiplikation kallas faktorer. täljare Talet

Läs mer

Datorsystemteknik DVG A03 Föreläsning 3

Datorsystemteknik DVG A03 Föreläsning 3 Datorsystemteknik DVG A03 Föreläsning 3 Datoraritmetik Större delen av materialet framtaget av :Jan Eric Larsson, Mats Brorsson och Mirec Novak IT-inst LTH Hur stora tal kan vi få med N bitar? Största

Läs mer

Lokala mål i matematik

Lokala mål i matematik Lokala mål i matematik År 6 År 7 År 8 År 9 Taluppfattning (aritmetik) förstår positionssystemets uppbyggnad med decimaler ex: kan skriva givna tal adderar decimaltal ex: 15,6 + 3,87 subtraherar decimaltal

Läs mer

Programmering II (ID1019) :00-11:00

Programmering II (ID1019) :00-11:00 ID1019 Johan Montelius Programmering II (ID1019) 2015-06-11 08:00-11:00 Instruktioner Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten. Svaren

Läs mer

TANA17 Matematiska beräkningar med Matlab

TANA17 Matematiska beräkningar med Matlab TANA17 Matematiska beräkningar med Matlab Laboration 1. Linjär Algebra och Avbildningar Namn: Personnummer: Epost: Namn: Personnummer: Epost: Godkänd den: Sign: Retur: 1 Introduktion I denna övning skall

Läs mer

TAIU07 Matematiska beräkningar med Matlab

TAIU07 Matematiska beräkningar med Matlab TAIU07 Matematiska beräkningar med Matlab Laboration 3. Linjär algebra Namn: Personnummer: Epost: Namn: Personnummer: Epost: Godkänd den: Sign: Retur: 1 Introduktion 2 En Komet Kometer rör sig enligt ellipsformade

Läs mer

Beräkningsvetenskap föreläsning 2

Beräkningsvetenskap föreläsning 2 Beräkningsvetenskap föreläsning 2 19/01 2010 - Per Wahlund if-satser if x > 0 y = 2 + log(x); else y = -1 If-satsen skall alltid ha ett villkor, samt en då det som skall hända är skrivet. Mellan dessa

Läs mer

Extramaterial till Matematik Y

Extramaterial till Matematik Y LIBER PROGRAMMERING OCH DIGITAL KOMPETENS Extramaterial till Matematik Y NIVÅ TVÅ Taluppfattning och tals användning ELEV Det finns många olika programmeringsspråk. I den här uppgiften ska du få bekanta

Läs mer

Sidor i boken 8-9, 90-93

Sidor i boken 8-9, 90-93 Sidor i boken 8-9, 90-93 Absolutbelopp Men först lite om Absolutbelopp., kallas absolutbeloppet av, och är avståndet för till origo på tallinjen. Som bekant är avståndet till origo för talet 4, 4. Detta

Läs mer

varandra. Vi börjar med att behandla en linjes ekvation med hjälp av figur 7 och dess bildtext.

varandra. Vi börjar med att behandla en linjes ekvation med hjälp av figur 7 och dess bildtext. PASS 8 EKVATIONSSYSTEM OCH EN LINJES EKVATION 8 En linjes ekvation En linjes ekvation kan framställas i koordinatsystemet Koordinatsystemet består av x-axeln och yaxeln X-axeln är vågrät och y-axeln lodrät

Läs mer

Användarhandledning Version 1.2

Användarhandledning Version 1.2 Användarhandledning Version 1.2 Innehåll Bakgrund... 2 Börja programmera i Xtat... 3 Allmänna tips... 3 Grunderna... 3 Kommentarer i språket... 4 Variabler... 4 Matematik... 5 Arrayer... 5 på skärmen...

Läs mer

Sammanfattningar Matematikboken Y

Sammanfattningar Matematikboken Y Sammanfattningar Matematikboken Y KAPitel 1 TAL OCH RÄKNING Numeriska uttryck När man beräknar ett numeriskt uttryck utförs multiplikation och division före addition och subtraktion. Om uttrycket innehåller

Läs mer

Komposanter, koordinater och vektorlängd Ja, den här teorin gick vi igenom igår. Istället koncentrerar vi oss på träning inför KS3 och tentamen.

Komposanter, koordinater och vektorlängd Ja, den här teorin gick vi igenom igår. Istället koncentrerar vi oss på träning inför KS3 och tentamen. Sidor i boken 40-4 Komposanter, koordinater och vektorlängd Ja, den här teorin gick vi igenom igår. Istället koncentrerar vi oss på träning inför KS3 och tentamen. Läxa 1. En rät linje, L 1, skär y-axeln

Läs mer

a), c), e) och g) är olikheter. Av dem har c) och g) sanningsvärdet 1.

a), c), e) och g) är olikheter. Av dem har c) och g) sanningsvärdet 1. PASS 9. OLIKHETER 9. Grundbegrepp om olikheter Vi får olikheter av ekvationer om vi byter ut likhetstecknet mot något av tecknen > (större än), (större än eller lika med), < (mindre än) eller (mindre än

Läs mer

Föreläsning 9: Talteori

Föreläsning 9: Talteori DD2458, Problemlösning och programmering under press Föreläsning 9: Talteori Datum: 2007-11-13 Skribent(er): Niklas Lindbom och Daniel Walldin Föreläsare: Per Austrin Den här föreläsningen behandlar modulär

Läs mer

5 Linjär algebra. 5.1 Addition av matriser 5 LINJÄR ALGEBRA

5 Linjär algebra. 5.1 Addition av matriser 5 LINJÄR ALGEBRA 5 LINJÄR ALGEBRA 5 Linjär algebra En kul gren av matematiken som inte fått speciellt mycket utrymme i gymnasiet men som har många tillämpningsområden inom t.ex. fysik, logistik, ekonomi, samhällsplanering

Läs mer

Matematik klass 4. Vårterminen. Namn: Anneli Weiland Matematik åk 4 VT 1

Matematik klass 4. Vårterminen. Namn: Anneli Weiland Matematik åk 4 VT 1 Matematik klass 4 Vårterminen Namn: Anneli Weiland Matematik åk 4 VT 1 Först 12 sidor repetition från höstterminen. Addition 7+5= 8+8= 7+8= 7+7= 8+3= 7+6= 6+6= 8+5= 6+5= 9+3= 9+5= 6+9= Subtraktion 11-2=

Läs mer

Precis som var fallet med förra artikeln, Geogebra för de yngre i Nämnaren

Precis som var fallet med förra artikeln, Geogebra för de yngre i Nämnaren Publicerad med tillstånd av Nämnaren Thomas Lingefjärd Geogebra i gymnasieskolan En tilltalande egenskap med Geogebra är att programmet kan användas tvärs över stora delar av utbildningssystemets matematikkurser.

Läs mer

Robotarm och algebra

Robotarm och algebra Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson 2010-12-07 Robotarm och algebra I denna laboration skall du lära dig lite mer om möjlighetera att rita ut mer avancerade

Läs mer

Talsystem Teori. Vad är talsystem? Av Johan Johansson

Talsystem Teori. Vad är talsystem? Av Johan Johansson Talsystem Teori Av Johan Johansson Vad är talsystem? Talsystem är det sätt som vi använder oss av när vi läser, räknar och skriver ner tal. Exempelvis hade romarna ett talsystem som var baserat på de romerska

Läs mer

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem Översikt Stegvis förfining Pseudokod Flödesdiagram Dekomposition KISS-regeln Procedurell dekomposition DRY-regeln Algoritmer Sortering och sökning Stegvis förfining Metod för att skapa ett program från

Läs mer

1 Den Speciella Relativitetsteorin

1 Den Speciella Relativitetsteorin 1 Den Speciella Relativitetsteorin På tidigare lektioner har vi studerat rotationer i två dimensioner samt hur vi kan beskriva föremål som roterar rent fysikaliskt. Att från detta gå över till den speciella

Läs mer

Känguru 2012 Junior sivu 1 / 8 (gymnasiet åk 1) i samarbete med Jan-Anders Salenius vid Brändö gymnasiet

Känguru 2012 Junior sivu 1 / 8 (gymnasiet åk 1) i samarbete med Jan-Anders Salenius vid Brändö gymnasiet Känguru 2012 Junior sivu 1 / 8 NAMN GRUPP Poängsumma: Känguruskutt: Lösgör svarsblanketten. Skriv ditt svarsalternativ under uppgiftsnumret. Lämna rutan tom om du inte vill besvara den frågan. Felaktigt

Läs mer

Grafik. För enklare datorsystem

Grafik. För enklare datorsystem Grafik För enklare datorsystem Grafik förr VGA-signalen Direktdriven grafik eller bildminne Bitmap-grafik Tile/teckenbaserad grafik Spritebaserad grafik Kollisionskontroll Rörelse : Hastighet / riktning

Läs mer

Block 1 - Mängder och tal

Block 1 - Mängder och tal Block 1 - Mängder och tal Mängder Mängder och element Venndiagram Delmängder och äkta delmängder Union och snittmängd Talmängder Heltalen Z Rationella talen Q Reella talen R Räkning med tal. Ordning av

Läs mer

MATEMATIK GU. LLMA60 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht 2014. Block 5, översikt

MATEMATIK GU. LLMA60 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht 2014. Block 5, översikt MATEMATIK GU H4 LLMA6 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht 24 I block 5 ingår följande avsnitt i Stewart: Kapitel 2, utom avsnitt 2.4 och 2.6; kapitel 4. Block 5, översikt Första delen av block 5

Läs mer

Grafik. För enklare datorsystem

Grafik. För enklare datorsystem Grafik För enklare datorsystem Grafik förr VGA-signalen Direktdriven grafik eller bildminne Bitmap-grafik Tile/teckenbaserad grafik Spritebaserad grafik Kollisionskontroll Rörelse : Hastighet / riktning

Läs mer

Lösning till fråga 5 kappa-06

Lösning till fråga 5 kappa-06 Lösning till fråga 5 kappa-06 Figurer till uppgift a) ligger samlade efter uppgiften. Inledning Betrakta först N punkter som tillhör den slutna enhetskvadraten inlagd i ett koordinatsystem enligt figur

Läs mer

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Att förstå variabler Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Vad är en variabel? En variabel är en plats att lagra information. Precis

Läs mer

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p Skriven av Michael Andersson Introduktion Programmering I högnivåspråk fokuserar på själv problemet (algoritmen) istället

Läs mer

Sphero SPRK+ Appen som används är Sphero Edu. När appen öppnas kommer man till denna bild.

Sphero SPRK+ Appen som används är Sphero Edu. När appen öppnas kommer man till denna bild. Sphero SPRK+ Appen som används är Sphero Edu När appen öppnas kommer man till denna bild. Klicka på 3D-modeller för att se delarna på Sphero Klicka här för att ansluta Sphero till ipad Programmet för att

Läs mer

Optimering av depåpositioner för den minimala bensinförbrukningen i öknen

Optimering av depåpositioner för den minimala bensinförbrukningen i öknen Optimering av depåpositioner för den minimala bensinförbrukningen i öknen Frågeställning: En jeep kan sammanlagt ha 200 liter bensin i tanken samt i lösa dunkar. Jeepen kommer 2,5 km på 1 liter bensin.

Läs mer

GeoGebra i matematikundervisningen - Inspirationsdagar för gymnasielärare. Karlstads universitet 19-20 april. Liten introduktionsguide för nybörjare

GeoGebra i matematikundervisningen - Inspirationsdagar för gymnasielärare. Karlstads universitet 19-20 april. Liten introduktionsguide för nybörjare GeoGebra i matematikundervisningen - Inspirationsdagar för gymnasielärare 19-20 april Liten introduktionsguide för nybörjare GeoGebra 0 Introduktionsövningar till GeoGebra När man startar GeoGebra är det

Läs mer

Föreläsning 3.1: Datastrukturer, en översikt

Föreläsning 3.1: Datastrukturer, en översikt Föreläsning.: Datastrukturer, en översikt Hittills har vi i kursen lagt mycket fokus på algoritmiskt tänkande. Vi har inte egentligen ägna så mycket uppmärksamhet åt det andra som datorprogram också består,

Läs mer

Taluppfattning och problemlösning

Taluppfattning och problemlösning Taluppfattning och problemlösning. Ett talsystem där siffrans värde beror på vilken position, plats, siffran har.. Olika sätt eller strategier att arbeta med problemlösning.. Problemlösningsmetod där man

Läs mer

Complex numbers. William Sandqvist

Complex numbers. William Sandqvist Complex numbers Hur många lösningar har en andragradsekvation? y = x 2 1 = 0 Två lösningar! Kommer Du ihåg konjugatregeln? Svaret kan ju lika gärna skrivas: x 1 = 1 x2 = + 1 Hur många lösningar har den

Läs mer

Matematik EXTRAUPPGIFTER FÖR SKOLÅR 7-9

Matematik EXTRAUPPGIFTER FÖR SKOLÅR 7-9 Matematik EXTRAUPPGIFTER FÖR SKOLÅR 7-9 Matematik Extrauppgifter för skolår 7-9 Pärm med kopieringsunderlag. Fri kopieringsrätt inom utbildningsenheten! Författare: Mikael Sandell Copyright 00 Sandell

Läs mer

1 Josefs bil har gått kilometer. Hur långt har den gått när han har kört (3) tio kilometer till? km

1 Josefs bil har gått kilometer. Hur långt har den gått när han har kört (3) tio kilometer till? km Test, version, lärarversion Instruktion Instruktioner och kommentarer är desamma som i testet i den ursprungliga versionen. Här är ingående tal förändrade och i något fall är uppgiften omformulerad. Betona

Läs mer

Grunderna i stegkodsprogrammering

Grunderna i stegkodsprogrammering Kapitel 1 Grunderna i stegkodsprogrammering Följande bilaga innehåller grunderna i stegkodsprogrammering i den form som används under kursen. Vi kommer att kort diskutera olika datatyper, villkor, operationer

Läs mer

Matematiska uppgifter

Matematiska uppgifter Årgång 54, 1971 Första häftet 8. Bestäm alla reella tal x sådana att x 1 3 x 1 + < 0 (Svar: {x R: 1 < x < 0} {x R: < x < 3}) 83. Visa att om x > y > 1 så är x y 1 > x y > ln(x/y). 84. Undersök om punkterna

Läs mer

Optimala vinkeln av bortklippt cirkelsektor fo r maximal volym pa glasstrut

Optimala vinkeln av bortklippt cirkelsektor fo r maximal volym pa glasstrut Optimala vinkeln av bortklippt cirkelsektor fo r maximal volym pa glasstrut Frågeställning Av en cirkulär pappersskiva kan en cirkelsektor med en viss vinkel klippas bort. Med den resterande sektorn går

Läs mer

Exempel. Vi skall bestämma koordinaterna för de punkter som finns i bild 3. OBS! Varje ruta motsvarar 1mm

Exempel. Vi skall bestämma koordinaterna för de punkter som finns i bild 3. OBS! Varje ruta motsvarar 1mm Koordinatsystem Koordinatsystem För att verktygen i en CNC-maskin skall kunna styras exakt till samtliga punkter i maskinens arbetsrum, använder man sig av ett koordinatsystem. Den enklaste formen av koordinatsystem

Läs mer

Dra streck. Vilka är talen? Dra pil till tallinjen. Skriv på vanligt sätt. Sätt ut <, > eller =

Dra streck. Vilka är talen? Dra pil till tallinjen. Skriv på vanligt sätt. Sätt ut <, > eller = n se ta l l ta al u at sen nt al rat l r l d d n iotu se hun tiot a ent a hu t tu + + 7 tiotusental tusental 7 tiotal 7 7 7 7 Ju längre till höger, desto större är talet. 7 > 7 Siffran betyder tiotusental

Läs mer

IE1205 Digital Design: F6 : Digital aritmetik 2

IE1205 Digital Design: F6 : Digital aritmetik 2 IE1205 Digital Design: F6 : Digital aritmetik 2 Talrepresentationer Ett tal kan representeras binärt på många sätt. De vanligaste taltyperna som skall representeras är: Heltal, positiva heltal (eng. integers)

Läs mer

Matematik 3 Digitala övningar med TI-82 Stats, TI-84 Plus och TI-Nspire CAS

Matematik 3 Digitala övningar med TI-82 Stats, TI-84 Plus och TI-Nspire CAS Matematik 3 Digitala övningar med TI-8 Stats, TI-84 Plus och TI-Nspire CAS Matematik 3 digitala övningar med TI-8 Stat, TI-84 Plus och TI Nspire CAS Vi ger här korta instruktioner där man med fördel kan

Läs mer

Matematik klass 4. Vårterminen FACIT. Namn:

Matematik klass 4. Vårterminen FACIT. Namn: Matematik klass 4 Vårterminen FACIT Namn: Använd ditt facit ofta för att se om du är på rätt väg och förstår. Om det är något som är konstigt, diskutera med din lärare eller en kompis. Du måste förstå

Läs mer

Läxa 9 7 b) Dividera 84 cm med π för att få reda på hur lång diametern är. 8 1 mm motsvarar 150 / 30 mil = = 5 mil. Omvandla till millimeter.

Läxa 9 7 b) Dividera 84 cm med π för att få reda på hur lång diametern är. 8 1 mm motsvarar 150 / 30 mil = = 5 mil. Omvandla till millimeter. LEDTRÅDAR LÄXOR Läa Förläng så att du får ett heltal i nämnaren. Använd division. Varje sekund klipper Karin, m =, m. Läa 0 ml = 0,0 liter Använd sambandet s = v t. Räkna ut hur mycket vattnet väger när

Läs mer

Dekomposition och dynamisk programmering

Dekomposition och dynamisk programmering Algoritmer, datastrukturer och komplexitet, hösten 2016 Uppgifter till övning 3 Dekomposition och dynamisk programmering Max och min med dekomposition I vektorn v[1..n] ligger n tal. Konstruera en dekompositionsalgoritm

Läs mer

Kort introduktion till POV-Ray, del 1

Kort introduktion till POV-Ray, del 1 Kort introduktion till POV-Ray, del 1 Kjell Y Svensson, 2004-02-02,2007-03-13 Denna serie av artiklar ger en grundläggande introduktion och förhoppningsvis en förståelse för hur man skapar realistiska

Läs mer

RÖRELSE. - Mätningar och mätinstrument och hur de kan kombineras för att mäta storheter, till exempel fart, tryck och effekt.

RÖRELSE. - Mätningar och mätinstrument och hur de kan kombineras för att mäta storheter, till exempel fart, tryck och effekt. RÖRELSE Inledning När vi går, springer, cyklar etc. förflyttar vi oss en viss sträcka på en viss tid. Ibland, speciellt när vi har bråttom, tänker vi på hur fort det går. I det här experimentet undersöker

Läs mer

INNEHÅLL XYZ. Hösten 2011 provpass 2 12 provpass Våren 2012 provpass 3 20 provpass Övningsprovet 28 KVA

INNEHÅLL XYZ. Hösten 2011 provpass 2 12 provpass Våren 2012 provpass 3 20 provpass Övningsprovet 28 KVA INNEHÅLL XYZ Hösten 2011 provpass 2 12 provpass 4 16 Våren 2012 provpass 3 20 provpass 5 24 Övningsprovet 28 KVA Hösten 2011 provpass 2 32 provpass 4 36 Våren 2012 provpass 3 40 provpass 5 44 Övningsprovet

Läs mer

Matematik med Scratch

Matematik med Scratch Matematik med Scratch Projekten är indelade efter svårighetsgrad. Ganska enkelt Lite svårare Innehåll Sprajten räknar... 2 Rita geometriska figurer... 3 Stämpla mönster av sprajtar... 6 Rita och räkna

Läs mer

Tentamen TEN1 HI

Tentamen TEN1 HI Tentamen TEN1 HI1029 2014-03-14 Skrivtid: 8.15-13.00 Hjälpmedel: Referensblad (utdelas), papper (tomma), penna Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha

Läs mer

Kapitel 4. cos(64 )= s s = 9 cos(64 )= 3.9m. cos(78 )= s s = 9 cos(78 )= 1.9m. a) tan(34 )= x x = 35 tan(34 )= 24cm

Kapitel 4. cos(64 )= s s = 9 cos(64 )= 3.9m. cos(78 )= s s = 9 cos(78 )= 1.9m. a) tan(34 )= x x = 35 tan(34 )= 24cm Kapitel 4 4107 4103 a) tan(34 )= x x = 35 tan(34 )= 4cm 35 b) cos(40 )= x x = 61 cos(40 )= 47cm 61 c) tan(56 )= 43 x x = 43 tan(56 ) = 9cm d) sin(53 )= x x = 75 sin(53 )= 60cm 75 4104 a) tan(v )= 7 4 v

Läs mer

Lösningar till udda övningsuppgifter

Lösningar till udda övningsuppgifter Lösningar till udda övningsuppgifter Övning 1.1. (i) {, } (ii) {0, 1,, 3, 4} (iii) {0,, 4, 6, 8} Övning 1.3. Påståendena är (i), (iii) och (v), varav (iii) och (v) är sanna. Övning 1.5. andra. (i) Nej.

Läs mer

Känguru 2012 Student sid 1 / 8 (gymnasiet åk 2 och 3) i samarbete med Jan-Anders Salenius vid Brändö gymnasiet

Känguru 2012 Student sid 1 / 8 (gymnasiet åk 2 och 3) i samarbete med Jan-Anders Salenius vid Brändö gymnasiet Känguru 2012 Student sid 1 / 8 NAMN GRUPP Poängsumma: Känguruskutt: Lösgör svarsblanketten. Skriv ditt svarsalternativ under uppgiftsnumret. Lämna rutan tom om du inte vill besvara den frågan. Felaktigt

Läs mer

Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.1, 4.3, 4.4, 4.5, 4.6, 4.13, 4.14 Övningsuppgifter 4.1 a-h, 4.2, 4.3, 4.4, 4.5, 4.

Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.1, 4.3, 4.4, 4.5, 4.6, 4.13, 4.14 Övningsuppgifter 4.1 a-h, 4.2, 4.3, 4.4, 4.5, 4. Moment 4.2.1, 4.2.2, 4.2., 4.2.4 Viktiga exempel 4.1, 4., 4.4, 4.5, 4.6, 4.1, 4.14 Övningsuppgifter 4.1 a-h, 4.2, 4., 4.4, 4.5, 4.7 Många av de objekt man arbetar med i matematiken och naturvetenskapen

Läs mer

i LabVIEW. Några programmeringstekniska grundbegrepp

i LabVIEW. Några programmeringstekniska grundbegrepp Institutionen för elektroteknik Några programmeringstekniska grundbegrepp 1999-02-16 Inledning Inom datorprogrammering förekommer ett antal grundbegrepp som är i stort sett likadana oberoende om vi talar

Läs mer

Parabeln och vad man kan ha den till

Parabeln och vad man kan ha den till Parabeln och vad man kan ha den till Anders Källén MatematikCentrum LTH anderskallen@gmail.com Sammanfattning I det här dokumentet diskuterar vi vad parabeln är för geometrisk konstruktion och varför den

Läs mer

Grafiska pipelinens funktion

Grafiska pipelinens funktion LUNDS TEKNISKA HÖGSKOLA CAMPUS HELSINGBORG Grafiska pipelinens funktion Ludvig von Sydow EDT62, HT17 Datorarkitekturer med Operativsystem Sammanfattning Denna rapport syftar till att beskriva hur en graphics

Läs mer

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel Tentamen TNM061, 3D-grafik och animering för MT2 Onsdag 20/8 2014 kl 14-18 SP71 Inga hjälpmedel Tentamen innehåller 7 uppgifter, vilka tillsammans kan ge maximalt 50 poäng. För betyg G (registreras som

Läs mer

1. (a) Bestäm alla värden på c som gör att matrisen A(c) saknar invers: 1 0 1. 1 c 1

1. (a) Bestäm alla värden på c som gör att matrisen A(c) saknar invers: 1 0 1. 1 c 1 ATM-Matematik Mikael Forsberg 734-4 3 3 För ingenjörs- och distansstudenter Linjär Algebra ma4a 5 4 Skrivtid: :-4:. Inga hjälpmedel. Lösningarna skall vara fullständiga och lätta att följa. Börja varje

Läs mer

Aktivitetsbank. Matematikundervisning med digitala verktyg II, åk 1-3. Maria Johansson, Ulrica Dahlberg

Aktivitetsbank. Matematikundervisning med digitala verktyg II, åk 1-3. Maria Johansson, Ulrica Dahlberg Aktivitetsbank Matematikundervisning med digitala, åk 1-3 Maria Johansson, Ulrica Dahlberg Matematik: Grundskola åk 1-3 Modul: Matematikundervisning med digitala Aktivitetsbank till modulen Matematikundervisning

Läs mer

Lennart Rolandsson, Uppsala universitet, Ulrica Dahlberg och Ola Helenius, NCM

Lennart Rolandsson, Uppsala universitet, Ulrica Dahlberg och Ola Helenius, NCM Matematik Gymnasieskola Modul: Matematikundervisning med digitala verktyg II Del 1: Om programmering Aktiviteter Del 1 Lennart Rolandsson, Uppsala universitet, Ulrica Dahlberg och Ola Helenius, NCM Ni

Läs mer

Ekvationer och system av ekvationer

Ekvationer och system av ekvationer Modul: Undervisa matematik utifrån problemlösning Del 4. Strategier Ekvationer och system av ekvationer Paul Vaderlind, Stockholms universitet Ekvationslösning är ett av de viktiga målen i skolmatematiken.

Läs mer

Uppsala Universitet Matematiska Institutionen Thomas Erlandsson

Uppsala Universitet Matematiska Institutionen Thomas Erlandsson Uppsala Universitet Matematiska Institutionen Thomas Erlandsson MATRISER MED MERA VEKTORRUM DEFINITION Ett vektorrum V är en mängd av symboler u som vi kan addera samt multiplicera med reella tal c så

Läs mer

Komplexa tal: Begrepp och definitioner

Komplexa tal: Begrepp och definitioner UPPSALA UNIVERSITET Baskurs i matematik, 5hp Matematiska institutionen Höstterminen 007 Erik Darpö Martin Herschend Komplexa tal: Begrepp och definitioner Komplexa tal uppstod ur det faktum att vissa andragradsekvationer,

Läs mer

Grafiska pipelinen. Edvin Fischer

Grafiska pipelinen. Edvin Fischer Grafiska pipelinen Edvin Fischer Sammanfattning Rapporten behandlar den grafiska pipelinen och dess steg, vilka stegen är och hur de funkar. Inledning Rapporten har till syfte att beskriva hur den grafiska

Läs mer

Uppgift 1 ( Betyg 3 uppgift )

Uppgift 1 ( Betyg 3 uppgift ) 2008-03-12.kl.14-19 Uppgift 1 ( Betyg 3 uppgift ) Du skall skriva ett program som läser igenom en textfil som heter FIL.TXT och skriver ut alla rader där det står ett decimaltal först på raden. Decimaltal

Läs mer

Laboration 4: Digitala bilder

Laboration 4: Digitala bilder Objektorienterad programmering, Z : Digitala bilder Syfte I denna laboration skall vi återigen behandla transformering av data, denna gång avseende digitala bilder. Syftet med laborationen är att få förståelse

Läs mer

Komplettering till kursboken i Numeriska beräkningar. 1 Beräkningsfelsanalys. 1.1 Uttryck med kancellation

Komplettering till kursboken i Numeriska beräkningar. 1 Beräkningsfelsanalys. 1.1 Uttryck med kancellation Linköpings Universitet Kompletterande material Matematiska institutionen/beräkningsmatematik 5 februari 203 Ingegerd Skoglund IT Termin 6 Komplettering till kursboken i Numeriska beräkningar Beräkningsfelsanalys

Läs mer

i=1 β i a i. (Rudolf Tabbe.) i=1 b i a i n

i=1 β i a i. (Rudolf Tabbe.) i=1 b i a i n Årgång 48, 1965 Första häftet 2505. Låt M = {p 1, p 2,..., p k } vara en mängd med k element. Vidare betecknar M 1, M 2,..., M n olika delmängder till M, alla bestående av tre element. Det gäller alltså

Läs mer

Regression med Genetiska Algoritmer

Regression med Genetiska Algoritmer Regression med Genetiska Algoritmer Projektarbete, Artificiell intelligens, 729G43 Jimmy Eriksson, jimer336 770529-5991 2014 Inledning Hur många kramar finns det i världen givet? Att kunna estimera givet

Läs mer

7 Extremvärden med bivillkor, obegränsade områden

7 Extremvärden med bivillkor, obegränsade områden Nr 7, 1 mars -5, Amelia 7 Extremvärden med bivillkor, obegränsade områden Största och minsta värden handlar om en funktions värdemängd. Värdemängden ligger givetvis mellan det största och minsta värdet,

Läs mer

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A SF1624 Algebra och geometri Lösningsförslag till tentamen 14129 DEL A 1 (a) Bestäm linjen genom punkterna A = (,, 1) och B = (2, 4, 1) (1 p) (b) Med hjälp av projektion kan man bestämma det kortaste avståndet

Läs mer

Kvalificeringstävling den 26 september 2017

Kvalificeringstävling den 26 september 2017 SKOLORNAS MATEMATIKTÄVLING Svenska matematikersamfundet Kvalificeringstävling den 6 september 017 1. Bestäm alla reella tal x, y, z som uppfyller ekvationerna x + = y y + = z z + = x Lösning 1. Addera

Läs mer

2-7: Bråk-förlängning Namn:.. Inledning

2-7: Bråk-förlängning Namn:.. Inledning 2-7: Bråk-förlängning Namn:.. Inledning I kapitlet om addition och subtraktion av bråk fick du lite problem när du stötte på bråk som hade olika nämnare. Då kunde man inte förenkla uttrycket, eftersom

Läs mer

Bråk. Introduktion. Omvandlingar

Bråk. Introduktion. Omvandlingar Bråk Introduktion Figuren till höger föreställer en tårta som är delad i sex lika stora bitar Varje tårtbit utgör därmed en sjättedel av hela tårtan I nästa figur är två av sjättedelarna markerade Det

Läs mer

Lösningar till utvalda uppgifter i kapitel 1

Lösningar till utvalda uppgifter i kapitel 1 Lösningar till utvalda uppgifter i kapitel. Vi utnyttjar definitionen av skalärprodukt som ger att u v u v, där α är (minsta) vinkeln mellan u v. I vårt fall så får vi 7 =. Alltså är den sökta vinkeln

Läs mer

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära

Läs mer

Funktionsstudier med derivata

Funktionsstudier med derivata Funktionsstudier med derivata Derivatan ett kraftfullt verktyg för att studera och tolka funktioner Det här avsnittet handlar om att man kan använda derivatan till att bestämma en funktions egenskaper

Läs mer

Ekvivalensrelationer

Ekvivalensrelationer Abstrakt datatyp för disjunkta mängder Vi skall presentera en abstrakt datatyp för att representera disjunkta mängder Kan bl.a. användas för att lösa ekvivalensproblemet avgör om två godtyckliga element

Läs mer

matematik Lektion Kapitel Uppgift Lösningg T.ex. print(9-2 * 2) a) b) c) d)

matematik Lektion Kapitel Uppgift Lösningg T.ex. print(9-2 * 2) a) b) c) d) 1 Print 2.6 Prioriteringsregler 1 Beräkna a) 9 2 2 b) 10 + 5 6 c) 5 6 10 d) 16 + 4 5 6 2.6 Prioriteringsregler 7 Stina köper 3 chokladbollar för 10 kr styck och 1 kopp te för 14 kr. a) Skriv ett uttryck

Läs mer

Språkstart Matematik Facit. Matematik för nyanlända. Jöran Petersson

Språkstart Matematik Facit. Matematik för nyanlända. Jöran Petersson Språkstart Matematik Facit Matematik för nyanlända Jöran Petersson Positionssystem hela tal s. 4-5 3. Skriv med siffror. 52 502 5002 65 665 6665 31 131 3131 4. Skriv hur mycket siffran är värd. 300 4 1000

Läs mer

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014 Introduktion till Datalogi DD1339 Föreläsning 2 22 sept 2014 Namn Fält1 Fält2 Fält3 Metod1 Metod2 Metod3 Metod4 public class { public class { Åtkomst, public betyder fullt tillgänglig utifrån public

Läs mer

Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.4, 4.5, 4.6, 4.7, 4.13 Handräkning 4.1, 4.2, 4.3, 4.4, 4.5, 4.7 Datorräkning 1-9 i detta dokument

Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.4, 4.5, 4.6, 4.7, 4.13 Handräkning 4.1, 4.2, 4.3, 4.4, 4.5, 4.7 Datorräkning 1-9 i detta dokument Moment 4.2.1, 4.2.2, 4.2.3, 4.2.4 Viktiga exempel 4.4, 4.5, 4.6, 4.7, 4.13 Handräkning 4.1, 4.2, 4.3, 4.4, 4.5, 4.7 Datorräkning 1-9 i detta dokument Många av de objekt man arbetar med i matematiken och

Läs mer