Ofta, när man jobbar med mediaprogrammering, stöter man på matematiska problem som man vet det finns formler för som man lärt sig i grundskolan men inte riktigt kommer ihåg definitionen av. Vanligtvis är det trigonometriska problem som dyker upp när det gäller interaktiv och dynamisk 3D programering. Många gånger behöver man räkna ut avstånd och positioner utifrån givna vinklar eller vise versa.
Innan jag fortsätter så kan det vara bra att förstå lite grunder vad det som gör att denna matematik fungerar och att sin, cos och tan inte bara blir abstrakta formler som man slår upp i en tabellsamling eller hackar in i en miniräknare. Anledningen till att det funnits tabeller är att dom numeriska talen vid dessa beräkningar är långa flyttal (många decimaler).
I denna artikel kommer jag att använda detta tecken π för att representera talet pi.
Pythagoras sats
Summan av arean (ytan) på den lutande kvadraten (hypotenusan) är lika med summan av arean på den motstående och den närliggande kvadraten.
För att illustrera detta med siffror. Låt oss säga att längden a = 1 och längden b = 1. Längden på c blir (kom ihåg att det är genom ytor vi får fram resultatet):
c2 = 12 + 12
c = √2 ≈ 1,414213562373095
Ytan på den kvadraten som står på hypotenusan (c) är alltid summan av ytan på dom två andra kvadraterna.
Ovanstående figur bevisar detta faktum. Oavsett var den gula pricken befinner sig så kommer c2 alltid vara summan av a2 + b2.
Sinus och cosinus kan definieras genom vad som kallas för enhetscirkeln. Den är en cirkel med radien 1 och är centrerad vid origo (0,0). Vad som är viktigt att komma ihåg är att resultaten av vinkeln α alltid är i radianer (inte grader).
I nedanstående bild ser vi hur man kan använda sig av Pythagoras sats i enhetscirkeln. Notera dock att Pythagoras sats bara funkar i den 1:a kvadranten. när vinkeln α blir 90° eller (π/2)rad så är det inte längre en rätvinklig triangel.
Låt oss bryta upp det i lite mindre beståndsdelar.
t är längden av bågen som startar på den högra sidan och rör sig motsols. cos(t) och sin(t) ger x och y koordinaterna vid den röda pricken på bågen.
Några saker värt att notera
t rör sig runt cirkeln vilket betyder att sinus och cosinus värdena kommer att upprepas
Cosinus och sinus värden är alltid en siffra mellan 1 och -1
För varje t, så är punkten (cos(t), sin(t)) avståndet 1 från centrum
Omkretsen av enhetscirkeln är 2 x π
Vinkeln α beskrivs här i grader men kan lika gärna illustreras som t radianer
Det kan vara bra att rita upp denna enkla bild när man brottas med trigonometriska problem så att man har grunderna klara för sig.
Geometrisk definition
Bilden beskriver en rätvinklig triangel med vinkeln α. Hypotenusan är motstående sida till den räta vinkeln, i detta fall r. För enkelhetens skull betrakta r som siffran 1 utifrån enhetscirkeln där r är radien 1. Då är det lite lättare att förstå varför sin och cos alltid har ett värde mellan -1 och 1 samt hur dessa värden kan räknas fram om man inte har tillgång till miniräknare eller tabeller. (Vad som kan vara lite förvirrande och lätt att missa i programering är att resultatet av den beräknade vinkelns värde är i radianer (se nedan) som måste konverteras om man vill ha värdet i grader.)
sinus
sin α = y / r
sinus för en vinkel är kvoten av motstående katet och hypotenusan
cosinus
cos α = x / r
cosinus för vinkeln α är kvoten av närliggande katet och hypotenusan
tangens
tan α = y / x
tangens för vinkeln α är kvoten av motstående och närliggande katet
cosekant
csc α = r / y
cosekant är inverterade värdet av sin α
sekant
sec α = r / x
sekant, är inverterade värdet av cos α
cotangens
cot α = y / r
cotangens är inverterade värdet av tan α
Det finns en bra webbplats som beskriver alla möjliga former av matematiska problem (khanacademy). Khan har en ramsa eller formel för att komma ihåg hur sin, cos och tan förhåller sig till varandra som han kallar för:
SOH CAH TOA
SOH = sin = opposite (motstående) / hypotenusan CAH = cos = adjacent (närliggande) / hypotenusan TOA = tan = opposite (motstående) / hypotenusan
Radianer
Ofta används radianer i stället för grader i många 3D tillämpningar. Radianer är matematiskt sett ett mer naturligt sätt att beskriva en vinkel på än det mer artificiella måttet grader som vi använder till vardags.
Samma enhetscirkel kan användas för att förstå vad radianer är. Som bilden här nere visar så är vinkeln α samma som t radianer.
Det är 2 x π radianer hela varvet runt. 2 x π radianer = 360° (grader)
För att konvertera från grader till radianer, multiplicera grad med (2 x π) / 360 (eller π/180)
För att konvertera från radianer till grader, multiplicera rad med 360 / (2 x π) (eller 180/π)
Beräkna t utifrån x och y
t beräknas med hjälp av arc-tangent funktionen (i Flash AS3 Math.atan(), i Director atan()).
Eftersom y/x = -y/-x och y/-x = -y/x, Math.atan(y/x)(AS3) kommer att returnera samma värde i dom skuggade områdena enligt bilden här ovan samt samma värde i dom oskuggade kvadranterna. Math.atan() låter dig inte specificera vilken kvadrant som menas utan kommer alltid att returnera ett värde på den högra sidan av cirkeln. Detta betyder att värdet kommer att ligga mellan π/2 och -π/2.
Detta betyder att om x är negativt (ligger i dom vänstra kvadranterna) så måste pi läggas till resultatet för att få värdet av t.
Flash exempel
R.I.P.
Director Exempel
3D Lingo som snurrar ett klot i en cirkel
exitFrame me angleInRadians = ((pi/2)/segments) * currentYpos y = sin(angleInRadians) * radie x = cos(angleInRadians) * radie klot.transform.position = vector( y, x, 100 ) currentYpos = currentYpos + 1 cyl.pointAt(klot.worldPosition, vector(0,0,1)) mem.light[1].pointAt(klot.worldPosition, vector(0,0,1)) end
R.I.P.
Kort sammanfattning
Omkretsen på en cirkel = 2 * radien π (eller diametern * π) halv cirkel = π