| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Vektorilaskentaatheril 28.01.02 20:35 Muutama funktio helpottamaan vektoreiden kanssa pelleilyä.
#include <math.h> struct vector{ double x; double y; double z; }; typedef struct vector vector; double dotprod(vector a, vector b){ return a.x*b.x + a.y*b.y + a.z*b.z; } vector crossprod(vector a, vector b){ vector x; x.x = (a.y*b.z)-(b.y*a.z); x.y = (a.z*b.x)-(b.z*a.x); x.z = (a.x*b.y)-(b.x*a.y); return x; } double vectorlen(vector a){ return sqrt((a.x*a.x) + (a.y*a.y) + (a.z*a.z)); } vector vectorxd(vector a, double d) { a.x *= d; a.y *= d; a.z *= d; return a; } vector vectorneg(vector a) { return vectorxd(a, -1); } vector vectoradd(vector a, vector b) { vector c; c.x = a.x + b.x; c.y = a.y + b.y; c.z = a.z + b.z; return c; } double vectorangle(vector a, vector b) { return acos((dotprod(a, b)/(vectorlen(a)*vectorlen(b)))); } vector unitvector(vector a){ double len; if((len = vectorlen(a)) != 0){ a.x /= len; a.y /= len; a.z /= len; } return a; } vector vectorproj(vector a, vector b){ //Vektori a projisoidaan vektorille b return vectorxd(b, dotprod(a, b)/dotprod(b, b)); } double scalarproj(vector a, vector b){ return dotprod(a, b)/vectorlen(b); } empty 21:45 28.12.02 noin optimoinnin kannalta: -tuota negaatiota ei kannata tehdä kertomalla -1:llä vaan mieluummin ihan kirjoittaa -a.x, -a.y ja -a.z -sen kulman voi laskea tehokkaammin atan-funktiolla (ehkä jopa atan2), jolloin ei tarvitse tehdä hitaita neliöjuurilaskuja (olettaen, etteivät kyseiset kirjastofunktiot laske neliöjuurilla :) -unitvector()issa voi säästää kalliita kellosyklejä laittamalla len = 1.0/len ja sitten a.x *= len jne., sillä jakolasku on _huomattavasti_ hitaampaa kuin kertominen -tietenkin pituuden voisi esilaskea struktiin itseensä jo komponentteja asetettaessa :> empty 21:47 28.12.02 luinpas sen kulmakohdan huonosti, no kahden vektorin kanssa en menisi sittenkään sanomaan kumpi tapa on nopeampi empty 14:43 22.7.03 "double x,y,z" sijaan voisi hyvin käyttää vectorin tyyppimäärittelyssä "double i[3]", mitä on huomattavasti mukavampi eri tilanteissa käsitellä. Vektorissa käytettävän liukulukutyypin olisi hyvä olla vaihdettavissa, vaikkakin menis vähän void kikkailuks. Tämä nyt ei ihan tälläisenään vielä ole temmattavissa mukaan ties mihin vektoreita tarvivaan C-härdelliin (hukkasin johonkin ite tekemäni version) :P |
![]() Haku
|