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 }