00001 #include <cmath> 00002 #include "HCoord4D.h" 00003 #include "NotNormalizableException.h" 00004 using namespace std; 00005 00006 namespace rcrt 00007 { 00008 00009 00010 void HCoord4D::assign(const HCoord4D& coords) 00011 { 00012 if(&coords != this){ 00013 values[0] = coords.values[0]; 00014 values[1] = coords.values[1]; 00015 values[2] = coords.values[2]; 00016 values[3] = coords.values[3]; 00017 } 00018 } 00019 00020 00021 HCoord4D::HCoord4D() 00022 { 00023 values[0] = values[1] = values[2] = values[3] = 0; 00024 } 00025 00026 00027 HCoord4D::HCoord4D(float xc, float yc, float zc, float wc) 00028 { 00029 values[0] = xc; 00030 values[1] = yc; 00031 values[2] = zc; 00032 values[3] = wc; 00033 } 00034 00035 00036 HCoord4D::HCoord4D(const HCoord4D& coords) 00037 { 00038 assign(coords); 00039 } 00040 00041 00042 HCoord4D::HCoord4D(const Point3D& p) 00043 { 00044 values[0] = p.x(); 00045 values[1] = p.y(); 00046 values[2] = p.z(); 00047 values[3] = 1; 00048 } 00049 00050 00051 HCoord4D::HCoord4D(const Vec3D& vec) 00052 { 00053 values[0] = vec.x(); 00054 values[1] = vec.y(); 00055 values[2] = vec.z(); 00056 values[3] = 0; 00057 } 00058 00059 00060 HCoord4D::~HCoord4D() 00061 { 00062 } 00063 00064 00065 const HCoord4D& HCoord4D::operator= (const HCoord4D& coord) 00066 { 00067 assign(coord); 00068 00069 return *this; 00070 } 00071 00072 00073 HCoord4D HCoord4D::operator+ (const HCoord4D& coord) const 00074 { 00075 return HCoord4D(values[0]+coord.values[0], 00076 values[1]+coord.values[1], 00077 values[2]+coord.values[2], 00078 values[3]+coord.values[3]); 00079 } 00080 00081 00082 HCoord4D HCoord4D::operator- (const HCoord4D& coord) const 00083 { 00084 return HCoord4D(values[0]-coord.values[0], 00085 values[1]-coord.values[1], 00086 values[2]-coord.values[2], 00087 values[3]-coord.values[3]); 00088 } 00089 00090 00091 float HCoord4D::operator* (const HCoord4D& coord) const 00092 { 00093 return values[0]*coord.values[0]+ 00094 values[1]*coord.values[1]+ 00095 values[2]*coord.values[2]+ 00096 values[3]*coord.values[3]; 00097 } 00098 00099 00100 const HCoord4D& HCoord4D::normalize() 00101 { 00102 if(values[3] == 0) 00103 throw NotNormalizableException(); 00104 else{ 00105 float rec = 1/values[3]; 00106 values[0] *= rec; 00107 values[1] *= rec; 00108 values[2] *= rec; 00109 values[3] = 1; 00110 } 00111 00112 return *this; 00113 } 00114 00115 00116 HCoord4D HCoord4D::normalized() const 00117 { 00118 if(values[3] == 0) 00119 throw NotNormalizableException(); 00120 else{ 00121 float rec = 1/values[3]; 00122 return HCoord4D(values[0]*rec,values[1]*rec,values[2]*rec,1); 00123 } 00124 } 00125 00126 00127 bool HCoord4D::isNormalized() const 00128 { 00129 return values[3] == 1; 00130 } 00131 00132 00133 float HCoord4D::norm() const 00134 { 00135 return sqrt(values[0]*values[0]+values[1]*values[1]+values[2]*values[2]+values[3]*values[3]); 00136 } 00137 00138 00139 Point3D HCoord4D::toPoint3D() const 00140 { 00141 float rec = 1/values[3]; 00142 return Point3D(values[0]*rec,values[1]*rec,values[2]*rec); 00143 } 00144 00145 00146 const float& HCoord4D::x() const 00147 { 00148 return values[0]; 00149 } 00150 00151 00152 const float& HCoord4D::y() const 00153 { 00154 return values[1]; 00155 } 00156 00157 00158 const float& HCoord4D::z() const 00159 { 00160 return values[2]; 00161 } 00162 00163 00164 const float& HCoord4D::w() const 00165 { 00166 return values[3]; 00167 } 00168 00169 }