#include #include "camara.hpp" #define PI 3.14159265358979323846 Camara::Camara( FILE *fp ) { olho.read( fp ); direcao.read( fp ); vup.read( fp ); fscanf( fp, " %lf %d %d ",&angulo, &colunas, &linhas ); PreparaRaios(); } void Camara::PreparaRaios( void ) { double tg_x = tan (PI*angulo/(2.0*180.)); double tg_y = tg_x * linhas / colunas; Vetor_3D u,v; // Determina xe, ye, ze ze = olho - direcao; ze.Normaliza(); xe = vup ^ ze; // produto vetorial xe.Normaliza(); ye = ze ^ xe ; // Acha PU u = tg_x*xe; v = tg_y*ye; P0 = olho - ze - u - v; // canto inferior esquerdo // dx e dy dx = (2.0*u) / (double) colunas; dy = (2.0*v) / (double) linhas; // Move P0 para o primeiro pixel P0 = P0 + dx/2.0 + dy/2.0; P_atual = P0; // ponto do raio atual P_linha = P0; // ponto mais a esquerda da linha l_atual = c_atual = 0; // linha e coluna do raio atual } Camara::~Camara() {} Raio Camara::PrimeiroRaio() { Raio retorno( olho, P0 ); l_atual = c_atual = 0; return (retorno); } Raio Camara::ProximoRaio() { Raio retorno; c_atual++; //Anda na linha if ( c_atual < colunas ) P_atual = P_atual + dx; //Anda na coluna else { c_atual = 0; l_atual++; if ( l_atual < linhas ) { P_linha = P_linha + dy; P_atual = P_linha; } else //Se chegou no fim, então recomeça { l_atual = 0; P_linha= P0; P_atual = P0; } } retorno.Atribui( olho, P_atual ); return (retorno); }