clase mundial para una sola esfera

Bueno, por fin ver una parte del cuadro. Antes de la clase, hay que darse cuenta mejor. Todo error en la primera clase, ahora llegamos uno por uno para resolver.

Echar un vistazo a la declaración de clase mundial:

Una vez #pragma 
#ifndef __WORLD_HEADER__ 
#define __WORLD_HEADER__ 

# include "geometry.h" 
# include "viewplane.h" 
# include "../objects/primitive/sphere.h" 
# include "../tracers/tracer.h" 

clase {mundo 
público: 
	mundo (); 
	mundo (const y WR mundo); 
	~ mundo (); 
	Construir vacío (); // inicializar los datos 
	vacío render (); // genera 
	add_object void (* Geometrics obj); // añadir objetos geométricos 
	void remove_object (Geometrics * obj); // geometría eliminar objetos 
	número entero get_object_size const (); // número de objetos geométricos, el uso de Kazakh en SingleSphere clase 
	hit_bare_bones_objects ShadeRec (const & ray ray); 
privado: 
	void open_window (entero HRES const, const vres enteros);// Inicializar ventana, condiciones pueden utilizar DirectX u OpenGL pantalla, se muestra aquí conmigo ppm archivo
	display_pixel vacío (fila número entero const, const columna entera, const RGBColor y color); // píxeles escritura 
	std :: stringstream ss; // búfer 
	std :: vector <Geometrics *> Objetos; 
	ViewPlane VP; // Ventana clase 
	backgrd_color RGBColor; // color de fondo 
	trazador * tracer_ptr; // ligera colisión y objeto geométrico 
}; 
#endif

  

implementación de la clase:

# include "pch.h" 
# include "world.h" 
# include "../tracers/singlesphere.h" 

mundo :: Mundial (): tracer_ptr (nullptr) {} 

Mundial :: ~ Mundial () {//写入到ppm文件
	std :: ofstream fout; 
	fout.open ( "test.ppm", std :: ios :: out); 
	fout.write (.. ss.str () c_str (), ss.str () size ()); 
	fout.close (); 
} 

Mundial :: Mundial (World & const WR) 
	: VP (wr.vp), backgrd_color (wr.backgrd_color), tracer_ptr (wr.tracer_ptr) { 
	objects.clear (); 
} 

Void mundo :: build () { 
	vp.set_hres (200); 
	vp.set_vres (100); // 200 * 100像素图片
	tracer_ptr = new SingleSphere (this); 
	Geometrics * obj = new Esfera (0, 0,5); 
	obj-> set_color (RGBColor (1, 0, 0)); //球体颜色是红色 
	add_object (obj); 
} 

Mundial vacío :: render () { 
	Ray ray; 
	x LHaga, y; 
	open_window (vp.hres, 
	Point3 SP; 
	ray.o Point3 = (0, 0 ,. 1); / / posiciones de fuente luminosa 
	para (entero r = vp.vres - 1 ; r> = 0; r -) // genera de izquierda a derecha-esquina-esquina, el libro está mal y debe hacerse así, de lo contrario la imagen se invierte es 
		para (C = 0 Integer; c <vp.hres; C ++) { 
			el RGBColor color; 
			X = vp.s * (C - 0,5 * vp.hres); 
			y = vp.s * & lt (R - 0.5 * vp.vres ); 
			ray.d Point3 = (X, y, -1); // sólo se necesita cambiar la dirección de la luz 
			color = tracer_ptr-> trace_ray (ray); 
			display_pixel (R & lt, C, color); 
		} 
} 

void mundo :: add_object (Geometrics * obj) { 
	objects.push_back (obj); 
}
 
void mundo :: remove_object (Geometrics * obj) { 
	for (IT = objects.begin Auto () ;! objects.end IT = (); TI ++) 
		SI ((* TI ) == obj) 
			objects.erase (TI); 
} 

get_object_size Entero mundo :: () const {
 
	retorno SR; 
}

vacío Mundial :: open_window (hres enteros const, vres enteros const) { 
	ss.clear (); 
	ss << "P3 \ n" << hres << "" << vres << "\ N255 \ n"; // ppm文件头
} 

vacío Mundial :: display_pixel (fila número entero const, columna entera const, const RGBColor y el co ) { 
	el color RGBColor c =; 
	si (vp.g = 1,0!) 
		c = color.powc (vp.g); 
	número entero IR = (número entero) (255,99 * cr), 
		ig = (número entero) (255,99 * cg), 
		ib = (número entero) (255,99 * cb); 
	ss << << ir "" << << ig "" << ib << "\ n"; //写入颜色值
}

 

Pues bien, ahora nos fijamos en la función principal llamarlo (después de llamar a la función principal que es lo mismo, por lo que no se repita)

# include "../Common/RayTracingGroundUp/utilities/world.h" 

int main () { 
	Mundial w; 
	w.build (); 
	w.render (); 
	return 0; 
}

 

La imagen resultante es el siguiente (porque estaba abierto bajo la computadora Mac Win7 máquina virtual, por lo que el mac viene ppm para leer el archivo, si Win7 no se abre, por favor utiliza Photoshop y otros software de mapas para abrir en la línea), y finalmente tuvo éxito:

Supongo que te gusta

Origin www.cnblogs.com/dalgleish/p/12602738.html
Recomendado
Clasificación