Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 2.2.1
- I denna uppgift är målet att skapa en kon med apex i origo och som växer oändligt stor när z → ∞ med hjälp av raytracern.
- Till en början skapas en ny klass med funktionerna lineTest, getNormal och isInside.
- Funktion getNormal använder enkelt den integrerade funktionen assign för att returnera normalen.
- Funktionen isInside im
- (Ox + a*dx)2 + (Oy + a*dy)2 - (Oy + a*dy)2 = 0
- (Ox2 + 2* Ox*a*dx + a2*dx2) + (Oy2 + 2* Oy*a*dy + a2*dy2 ) -(Oz2 + 2* Oz*a*dz + a2*dz2) = 0
- (a2*dx2 + a2*dy2- a2*dz2) + (2* Ox*a*dx + 2*Oy*a*dy - 2* Oz*a*dz) + (Ox2 + Oy2 - Oz2) = 0
- a2(dx2 + dy2- dz2) + a(2* Ox*dx + 2*Oy*dy - 2* Oz*dz) + (Ox2 + Oy2 - Oz2) = 0
- Jag väljer att benämna i enighet med:
- A = (dx2 + dy2- dz2)
- B = (2* Ox*dx + 2*Oy*dy - 2* Oz*dz)
- C = (Ox2 + Oy2 - Oz2)
- Vilket ger oss:
- a2*A + a*B – C = 0
- a2 + a*B/A – C/A = 0/A = 0
- Nu ser vi att eftersom att samtliga komponenter utom a är konstanter så kan vi lösa denna ekvation med pq-formeln:
- x^2 + px – q = 0=> x = -p/2±√((p/2)^2+q)
- där
- a = x
- p = B/A
- q = C/A
- Därefter implementeras detta i koden genom att i vår lineTest-funktion först ser
- -p/2-√((p/2)^2+q)>0
- och om detta stämmer så returnera resultat.
- Om det ej stämmer så kollar funktionen om
- -p/2+√((p/2)^2+q)>0
- och om detta stämmer så returnera resultatet.
- Om detta ej stämmer så returneras makrot MAX_DISTANCE.
- Vi har efter detta fått två oändliga koner, en som växer när z → ∞ och en som växer när z → -∞
- För att få enbart få den konen som vi önskar så måste vi lägga till ett villkor vid varje returnering av ett värde som ej är MAX_DISTANCE.
- Därför läggs villkoret
- Oz + dz * solution >= 0
- där solution = -p/2-√((p/2)^2+q)>0
- eller solution = -p/2+√((p/2)^2+q)>0
- till vid respektive retur ur funktionen
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement