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 //==============================================================
1.5.1-p1