📄 utility.h
字号:
// ******************************************************************//// Physically Correct Direct Lighting For Distribution Ray Tracing// by Changyaw Wang//// utility.h//// ******************************************************************#include <math.h>#include <stream.h>class point;class vector;class rotation_matrix;class point {public: double data[3]; point(); point(double, double, double); point& operator=(const point&);};class vector {public: double data[3]; vector(); vector(double,double,double); vector& operator=(const vector&); void normalize(); friend vector operator*(double, const vector&);};class rotation_matrix {protected: double data[4][4];public: void set_identity(); void set_xyz_to_uvw(const vector&, const vector&, const vector&); friend vector operator*(const rotation_matrix&, const vector&);};inline point::point() {}inline vector::vector() {}inline point& point::operator=(const point& v){ data[0] = v.data[0]; data[1] = v.data[1]; data[2] = v.data[2]; return *this;}inline point::point(double a, double b, double c){ data[0] = a; data[1] = b; data[2] = c; }inline vector::vector(double a, double b, double c){ data[0] = a; data[1] = b; data[2] = c;}inline vector& vector::operator=(const vector& v){ data[0] = v.data[0]; data[1] = v.data[1]; data[2] = v.data[2]; return *this;}inline vector operator*(double d, const vector& v){ return vector(d * v.data[0], d * v.data[1], d * v.data[2] ); }inline void vector::normalize(){ double length; length = sqrt(data[0]*data[0] + data[1]*data[1] + data[2]*data[2]); if (length <= 1.0e-6) { data[0] = 1.0; data[1] = 0.0; data[2] = 0.0; } else { length = 1.0 / length; data[0] *= length; data[1] *= length; data[2] *= length; }}inline void rotation_matrix::set_identity(){ data[0][0] = data[1][1] = data[2][2] = data[3][3] = 1.0; data[0][1] = data[0][2] = data[0][3] = 0.0; data[1][0] = data[1][2] = data[1][3] = 0.0; data[2][0] = data[2][1] = data[2][3] = 0.0; data[3][0] = data[3][1] = data[3][2] = 0.0;}void rotation_matrix::set_xyz_to_uvw(const vector& u, const vector& v, const vector& w){ this->set_identity(); data[0][0] = u.data[0]; data[1][0] = u.data[1]; data[2][0] = u.data[2]; data[0][1] = v.data[0]; data[1][1] = v.data[1]; data[2][1] = v.data[2]; data[0][2] = w.data[0]; data[1][2] = w.data[1]; data[2][2] = w.data[2];}inline point operator+(const point& p, const vector& v){ return point(p.data[0] + v.data[0], p.data[1] + v.data[1], p.data[2] + v.data[2]);}inline vector operator*(const rotation_matrix& r, const vector& v){ return vector(r.data[0][0]*v.data[0] + r.data[0][1]*v.data[1] + r.data[0][2]*v.data[2] + r.data[0][3], r.data[1][0]*v.data[0] + r.data[1][1]*v.data[1] + r.data[1][2]*v.data[2] + r.data[1][3], r.data[2][0]*v.data[0] + r.data[2][1]*v.data[1] + r.data[2][2]*v.data[2] + r.data[2][3]);}inline vector operator-(const point& u, const point& v){ return vector(u.data[0]-v.data[0], u.data[1]-v.data[1], u.data[2]-v.data[2]);}inline double dot(const vector& a, const vector& b){ return ( a.data[0]*b.data[0] + a.data[1]*b.data[1] + a.data[2] * b.data[2] );}inline double distance_squared(const point& a, const point& b){ double x,y,z; x = a.data[0] - b.data[0]; y = a.data[1] - b.data[1]; z = a.data[2] - b.data[2]; return x*x + y*y + z*z;}inline double distance(const point& a, const point& b){ double t; t = distance_squared(a,b); return sqrt(t);}inline vector spherical_to_vector(double theta, double phi){ return vector(sin(theta)*cos(phi), sin(theta)*sin(phi), cos(theta));}inline vector cross(const vector& a, const vector &b){ return vector(a.data[1]*b.data[2] - a.data[2]*b.data[1], a.data[2]*b.data[0] - a.data[0]*b.data[2], a.data[0]*b.data[1] - a.data[1]*b.data[0]);}#include "geometry_object.h"#include "sphere_luminaire.h"#include "triangle_luminaire.h"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -