Main Page Class Hierarchy Compound List File List Compound Members File Members

VecUtil.h

Go to the documentation of this file.
00001 /*
00002 File: VecUtil.h
00003 
00004 Function: Contains a grab-bag of useful graphics
00005 vector routines.
00006 
00007 Author(s): Andrew Willmott
00008 
00009 Copyright: (c) 1996-2000, Andrew Willmott
00010 
00011 */
00012 
00013 #ifndef __VecUtil__
00014 #define __VecUtil__
00015 
00016 #include "gcl/Geometry.h"
00017 #include "gcl/Colour.h"
00018 
00019 
00020 // --- Min & Max routines -----------------------------------------------------
00021 
00022 inline GCLReal MaxElt(const Vector &v);
00024 inline GCLReal MinElt(const Vector &v);
00026 
00027 inline Int MaxEltIndex(const Vector &v);
00029 inline Int MinEltIndex(const Vector &v);
00031 
00032 inline Void FindMaxElts(const Vector &a, const Vector &b, Vector &c);
00034 inline Void FindMinElts(const Vector &a, const Vector &b, Vector &c);
00036 
00037 inline ClrReal MaxCmpt(const Colour &c);
00039 inline ClrReal MinCmpt(const Colour &c);
00040 
00041 inline Int MaxCmptIndex(const Colour &c);
00042 inline Int MinCmptIndex(const Colour &c);
00043 
00044 inline Void FindMaxCmpts(const Colour &a, const Colour &b, Colour &c);
00045 inline Void FindMinCmpts(const Colour &a, const Colour &b, Colour &c);
00046 
00047 // --- Bounding box utility routines ------------------------------------------
00048 
00049 inline GCLReal BoxVol(const Vector &min, const Vector &max);
00051 inline GCLReal BoxArea(const Vector &min, const Vector &max);
00053 Void UpdateBounds(const Point& pt, Point& min, Point& max);
00055 
00056 // --- Miscellaneous ----------------------------------------------------------
00057 
00058 Void CalcTriAreaNormal(
00059 const Point &a,
00060 const Point &b, 
00061 const Point &c,
00062 Vector &n
00063 );
00065 
00066  inline Bool PlaneIntersection(
00067 const Point &start,
00068 const Vector &direction,
00069 GCLReal d, 
00070 const Vector &normal, 
00071 GCLReal &t
00072 )
00078 {
00079 GCLReal normDotDirection = dot(normal, direction);
00080 
00081 if (normDotDirection == 0.0)
00082 return(false);
00083 
00084 t = (d + dot(normal, start)) / -normDotDirection;
00085 
00086 return(true);
00087 }
00088 
00089 Bool PointIsInsideTriangle(
00090 const Point &v0, 
00091 const Point &v1, 
00092 const Point &v2, 
00093 const Point &point,
00094 Vector *coords = 0
00095 );
00097 
00098  inline Vector FindOrthoVector(const Vector &v)
00102 {
00103 Vector u;
00104 
00105 // we choose the axis that is most orthogonal to v,
00106 // and return the cross product of it and v. Really!
00107 
00108 if (abs(v[0]) < abs(v[1]))
00109 if (abs(v[0]) < abs(v[2]))
00110 { u[0] = 0; u[1] = v[2]; u[2] = -v[1]; }
00111 else
00112 { u[0] = v[1]; u[1] = -v[0]; u[2] = 0; }
00113 else
00114 if (abs(v[1]) < abs(v[2]))
00115 { u[0] = -v[2]; u[1] = 0; u[2] = v[0]; }
00116 else
00117 { u[0] = v[1]; u[1] = -v[0]; u[2] = 0; }
00118 
00119 return(u);
00120 }
00121 
00122 Vector RandomVector();
00124 
00125 Bool Refract(
00126 GCLReal fromIndex, 
00127 GCLReal toIndex,
00128 const Vector &v,
00129 const Vector &n, 
00130 GCLReal cosNV,
00131 Vector &refractDir
00132 );
00134 
00135 Void UnitSquareToUnitDisc(Coord in, Coord &out);
00136 Void UnitDiskToUnitSquare(Coord in, Coord &out);
00137 Void UnitSquareToUnitDisc(Coord in, Coord &out);
00138 Void UnitDiskToUnitSquare(Coord in, Coord &out);
00139 // What the names say: code from Shirley & Chiu, minimises adjacency,
00140 // fractional area and aspect ratio distortions.
00141 
00142 GCLReal ProjectToBox(Point &min, Point &max, Point &p, Vector &r);
00144 
00145 
00146 // --- Inlines ----------------------------------------------------------------
00147 
00148  inline GCLReal MaxElt(const Vector &v)
00149 {
00150 return(Max(Max(v[0], v[1]), v[2]));
00151 }
00152 
00153  inline GCLReal MinElt(const Vector &v)
00154 {
00155 return(Min(Min(v[0], v[1]), v[2]));
00156 }
00157 
00158  inline Int MinEltIndex(const Vector &v)
00159 {
00160 if (v[0] < v[1])
00161 if (v[0] < v[2])
00162 return(0);
00163 else
00164 return(2);
00165 else
00166 if (v[1] < v[2])
00167 return(1);
00168 else
00169 return(2);
00170 }
00171 
00172  inline Int MaxEltIndex(const Vector &v)
00173 {
00174 if (v[0] > v[1])
00175 if (v[0] > v[2])
00176 return(0);
00177 else
00178 return(2);
00179 else
00180 if (v[1] > v[2])
00181 return(1);
00182 else
00183 return(2);
00184 }
00185 
00186  inline Int MinCmptIndex(const Colour &c)
00187 {
00188 if (c[0] < c[1])
00189 if (c[0] < c[2])
00190 return(0);
00191 else
00192 return(2);
00193 else
00194 if (c[1] < c[2])
00195 return(1);
00196 else
00197 return(2);
00198 }
00199 
00200  inline Int MaxCmptIndex(const Colour &c)
00201 {
00202 if (c[0] > c[1])
00203 if (c[0] > c[2])
00204 return(0);
00205 else
00206 return(2);
00207 else
00208 if (c[1] > c[2])
00209 return(1);
00210 else
00211 return(2);
00212 }
00213 
00214  inline Void FindMaxElts(const Vector &a, const Vector &b, Vector &c)
00215 {
00216 c[0] = Max(a[0], b[0]);
00217 c[1] = Max(a[1], b[1]);
00218 c[2] = Max(a[2], b[2]);
00219 }
00220 
00221  inline Void FindMinElts(const Vector &a, const Vector &b, Vector &c)
00222 {
00223 c[0] = Min(a[0], b[0]);
00224 c[1] = Min(a[1], b[1]);
00225 c[2] = Min(a[2], b[2]);
00226 }
00227 
00228  inline ClrReal MaxCmpt(const Colour &c)
00229 {
00230 return(Max(Max(c[0], c[1]), c[2]));
00231 }
00232 
00233  inline ClrReal MinCmpt(const Colour &c)
00234 {
00235 return(Min(Min(c[0], c[1]), c[2]));
00236 }
00237 
00238  inline Void FindMaxCmpts(const Colour &a, const Colour &b, Colour &c)
00239 {
00240 c[0] = Max(a[0], b[0]);
00241 c[1] = Max(a[1], b[1]);
00242 c[2] = Max(a[2], b[2]);
00243 }
00244 
00245  inline Void FindMinCmpts(const Colour &a, const Colour &b, Colour &c)
00246 {
00247 c[0] = Min(a[0], b[0]);
00248 c[1] = Min(a[1], b[1]);
00249 c[2] = Min(a[2], b[2]);
00250 }
00251 
00252  inline GCLReal BoxVol(const Vector &min, const Vector &max)
00253 {
00254 Vector t = max;
00255 
00256 t -= min;
00257 
00258 return(t[0] * t[1] * t[2]);
00259 }
00260 
00261  inline GCLReal BoxArea(const Vector &min, const Vector &max)
00262 {
00263 Vector t = max;
00264 
00265 t -= min;
00266 
00267 return(2 * (t[0] * t[1] + t[1] * t[2] + t[2] * t[0]));
00268 }
00269 
00270 #endif

Generated at Sat Aug 5 00:17:04 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /