VCRA-SZCZERBACKI-PointBasedRendering/ssAdditional.cpp

00001 #include "ssAdditional.hpp"
00002 
00003 using namespace SS;
00004 
00005 //==============================================================
00006 //==============================================================
00007 
00008 //maximum absolute row sum norm
00009 float SS::norm_inf( const Matrix3x3 &m )
00010 {
00011         float n = 0.0f;
00012         for(int i=0;i<3;i++)
00013         {
00014                 float nn = fabs(m[i][0]) + fabs(m[i][1]) + fabs(m[i][2]); 
00015                 if( nn > n ) n = nn;
00016         }
00017         return n;
00018 }
00019 
00020 //==============================================================
00021 //==============================================================
00022 
00023 //maximum absolute column sum norm
00024 float SS::norm_1( const Matrix3x3 &m )
00025 {
00026         float n = 0.0f;
00027         for(int i=0;i<3;i++)
00028         {
00029                 float nn = fabs(m[0][i]) + fabs(m[1][i]) + fabs(m[2][i]); 
00030                 if( nn > n ) n = nn;
00031         }
00032         return n;
00033 }
00034 
00035 //==============================================================
00036 //==============================================================
00037 
00038 // random vector generation
00039 Vector3 SS::randInBox( )
00040 {
00041         return Vector3(randMinusHalfHalf( ), randMinusHalfHalf( ), randMinusHalfHalf( ));
00042 }
00043 
00044 //==============================================================
00045 //==============================================================
00046 
00047 Vector3 SS::randInBox( float edgeLength )
00048 {
00049         return randInBox() * edgeLength * 0.5f;
00050 }
00051 
00052 //==============================================================
00053 //==============================================================
00054 
00055 Vector3 SS::randOnSphere()
00056 {
00057         //distribution is uniform when random vectors inside a unit sphere are normalized
00058         Vector3 t;
00059         float d;
00060         do
00061         {
00062                 t.x = randMinusHalfHalf( ); t.y = randMinusHalfHalf( ); t.z = randMinusHalfHalf( );
00063                 d = dot(t, t);
00064         }
00065         while( d == 0.0f || d > 1.0f );
00066 
00067         t.normalize( );
00068         return t;
00069 }
00070 
00071 //==============================================================
00072 //==============================================================
00073 
00074 Vector3 SS::randOnSphere( float radius )
00075 {
00076         return randOnSphere() * radius;
00077 }
00078 
00079 //==============================================================
00080 //==============================================================
00081 
00082 Vector3 SS::randInSphere( )
00083 {
00084         //distribution is uniform when random vectors inside a unit sphere are normalized
00085         Vector3 t;
00086         float d;
00087         do
00088         {
00089                 t.x = randMinusHalfHalf( ); t.y = randMinusHalfHalf( ); t.z = randMinusHalfHalf( );
00090                 d = dot(t, t);
00091         }
00092         while( d > 1.0f );
00093         return t;
00094 }
00095 
00096 //==============================================================
00097 //==============================================================
00098 
00099 Vector3 SS::randInSphere( float radius )
00100 {
00101         return randInSphere() * radius;
00102 }
00103 
00104 //==============================================================
00105 //==============================================================
00106 
00107 Vector2 SS::randInCircle( )
00108 {
00109         //distribution is uniform when random vectors inside a unit sphere are normalized
00110         Vector2 t;
00111         float d;
00112         do
00113         {
00114                 t.x = randMinusHalfHalf( ); t.y = randMinusHalfHalf( );
00115                 d = dot(t, t);
00116         }
00117         while( d > 1.0f );
00118         return t;
00119 }
00120 
00121 //==============================================================
00122 //==============================================================
00123 
00124 Vector3 SS::perpendicular( const Vector3 &v )
00125 {
00126         Vector3 t;
00127         //select the shortest of projections of axes on v (the closest to perpendicular to v),
00128         // and project it to the plane defined by v
00129         if( fabs(v.x) < fabs(v.y) )
00130         {       //x < y
00131                 if( fabs(v.x) < fabs(v.z) )
00132                 {       // x < y && x < z
00133                         t.x = 1.0f - v.x * v.x;
00134                         t.y = -v.x * v.y;
00135                         t.z = -v.x * v.z;
00136                         return t;
00137                 }
00138         }
00139         else
00140         {       //y <= x
00141                 if( fabs(v.y) < fabs(v.z) )
00142                 {       // y <= x && y < z
00143                         t.x = -v.y * v.x;
00144                         t.y = 1.0f - v.y * v.y;
00145                         t.z = -v.y * v.z;
00146                         return t;
00147                 }
00148         }
00149 
00150         //z <= x && z <= y
00151         t.x = -v.z * v.x;
00152         t.y = -v.z * v.y;
00153         t.z = 1.0f - v.z * v.z;
00154         return t;
00155 }
00156 
00157 //==============================================================
00158 //==============================================================

Generated on Thu Feb 15 09:09:20 2007 for Surface Splating by  doxygen 1.5.1-p1