csgeom/math3d.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 1998-2005 by Jorrit Tyberghein 00003 Largely rewritten by Ivan Avramovic <[email protected]> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_MATH3D_H__ 00021 #define __CS_MATH3D_H__ 00022 00030 #include "csextern.h" 00031 00032 #include "csgeom/box.h" 00033 #include "csgeom/frustum.h" 00034 #include "csgeom/plane3.h" 00035 #include "csgeom/segment.h" 00036 #include "csgeom/vector3.h" 00037 #include "csutil/ref.h" 00038 #include "csutil/scf_implementation.h" 00039 00040 #include "iutil/dbghelp.h" 00041 00042 struct iString; 00043 class csPlane2; 00044 class csPoly3D; 00045 00050 class CS_CRYSTALSPACE_EXPORT csMath3 00051 { 00052 public: 00065 static int WhichSide3D (const csVector3& p, 00066 const csVector3& v1, const csVector3& v2) 00067 { 00068 // float s = p * (v1%v2); (original expression: expanded to the below:) 00069 float s = p.x*(v1.y*v2.z-v1.z*v2.y) + p.y*(v1.z*v2.x-v1.x*v2.z) + 00070 p.z*(v1.x*v2.y-v1.y*v2.x); 00071 if (s < 0) return 1; 00072 else if (s > 0) return -1; 00073 else return 0; 00074 } 00075 00081 static bool Visible (const csVector3& p, const csVector3& t1, 00082 const csVector3& t2, const csVector3& t3); 00083 00089 static bool Visible (const csVector3& p, const csPlane3& pl) 00090 { return pl.Classify (p) <= 0; } 00091 00101 static void Between (const csVector3& v1, const csVector3& v2, csVector3& v, 00102 float pct, float wid); 00103 00110 static void SetMinMax (const csVector3& v, 00111 csVector3& min, csVector3& max) 00112 { 00113 if (v.x > max.x) max.x = v.x; else if (v.x < min.x ) min.x = v.x; 00114 if (v.y > max.y) max.y = v.y; else if (v.y < min.y ) min.y = v.y; 00115 if (v.z > max.z) max.z = v.z; else if (v.z < min.z ) min.z = v.z; 00116 } 00117 00123 inline static float DoubleArea3 (const csVector3 &a, const csVector3 &b, 00124 const csVector3 &c) 00125 { 00126 csVector3 v1 = b - a; 00127 csVector3 v2 = c - a; 00128 return (v1 % v2).Norm (); 00129 } 00130 00134 inline static float Direction3 (const csVector3 &a, const csVector3 &b, 00135 const csVector3 &c) 00136 { 00137 csVector3 v1 = b - a; 00138 csVector3 v2 = c - a; 00139 return ((v1.y * v2.z + v1.z * v2.x + v1.x * v2.y) - 00140 (v1.y * v2.x + v1.x * v2.z + v1.z * v2.y)); 00141 } 00142 00148 inline static void CalcNormal (csVector3& norm, const csVector3& v1, 00149 const csVector3& v2, const csVector3& v3) 00150 { 00151 norm = (v1-v2)%(v1-v3); 00152 } 00153 00159 static void CalcNormal (csVector3& norm, 00160 const csVector3& v, const csVector3& u) 00161 { norm = u%v; /* NOT v%u - vertexes are defined clockwise */ } 00162 00169 static void CalcPlane (const csVector3& v1, const csVector3& v2, 00170 const csVector3& v3, csVector3& normal, float& D) 00171 { 00172 CalcNormal (normal, v1, v2, v3); 00173 D = - (normal * v1); 00174 } 00175 00182 static bool PlanesEqual (const csPlane3& p1, const csPlane3& p2) 00183 { 00184 return ( ( p1.norm - p2.norm) < (float).001 ) && 00185 ( ABS (p1.DD-p2.DD) < (float).001 ); 00186 } 00187 00193 static bool PlanesClose (const csPlane3& p1, const csPlane3& p2); 00194 00202 static int OuterPlanes (const csBox3& box1, const csBox3& box2, 00203 csPlane3* planes); 00204 00212 static int FindObserverSides (const csBox3& box1, const csBox3& box2, 00213 int* sides); 00214 00220 static void SpherePosition (float angle_xz, float angle_vert, 00221 csVector3& pos); 00222 }; 00223 00228 class CS_CRYSTALSPACE_EXPORT csSquaredDist 00229 { 00230 public: 00232 static float PointPoint (const csVector3& p1, const csVector3& p2) 00233 { 00234 csVector3 d = (p1-p2); 00235 return d*d; 00236 } 00237 00239 static float PointLine (const csVector3& p, 00240 const csVector3& l1, const csVector3& l2); 00241 00243 static float PointPlane (const csVector3& p, const csPlane3& plane) 00244 { float r = plane.Classify (p); return r * r; } 00245 00252 static float PointPoly (const csVector3& p, csVector3 *V, int n, 00253 const csPlane3& plane, float sqdist = -1); 00254 }; 00255 00261 class CS_CRYSTALSPACE_EXPORT csIntersect3 00262 { 00263 private: 00264 static bool BoxPlaneInternal (const csVector3& normal, 00265 const csVector3& vert, const csVector3& boxhalfsize); 00266 00267 public: 00274 static bool PlanePolygon (const csPlane3& plane, csPoly3D* poly, 00275 csSegment3& segment); 00276 00286 static int SegmentFrustum (csPlane3* planes, int num_planes, 00287 csSegment3& seg); 00288 00295 static bool SegmentTriangle (const csSegment3& seg, 00296 const csVector3& tr1, 00297 const csVector3& tr2, const csVector3& tr3, 00298 csVector3& isect); 00299 00307 static bool SegmentPolygon (const csSegment3& seg, const csPoly3D& poly, 00308 const csPlane3& poly_plane, csVector3& isect); 00309 00318 static bool SegmentPlanes ( 00319 const csVector3& u, const csVector3& v, 00320 const csPlane3* planes, int length, 00321 csVector3& isect, float& dist); 00322 00328 static bool SegmentPlane ( 00329 const csVector3& u, const csVector3& v, 00330 const csVector3& normal, const csVector3& a, // plane 00331 csVector3& isect, float& dist); // intersection point 00332 00355 static bool SegmentPlane ( 00356 const csVector3& u, const csVector3& v, 00357 const csPlane3& p, // plane Ax+By+Cz+D=0 00358 csVector3& isect, // intersection point 00359 float& dist); // distance from u to isect 00360 00367 static bool ThreePlanes (const csPlane3& p1, const csPlane3& p2, 00368 const csPlane3& p3, csVector3& isect); 00369 00376 static bool PlaneXPlane (const csPlane3& p1, float x2, csPlane2& isect); 00377 00384 static bool PlaneYPlane (const csPlane3& p1, float y2, csPlane2& isect); 00385 00392 static bool PlaneZPlane (const csPlane3& p1, float z2, csPlane2& isect); 00393 00400 static bool PlaneAxisPlane (const csPlane3& p1, int nr, float pos, 00401 csPlane2& isect) 00402 { 00403 switch (nr) 00404 { 00405 case 0: return PlaneXPlane (p1, pos, isect); 00406 case 1: return PlaneYPlane (p1, pos, isect); 00407 case 2: return PlaneZPlane (p1, pos, isect); 00408 } 00409 return false; 00410 } 00411 00418 static float SegmentZ0Plane ( 00419 const csVector3& v1, const csVector3& v2, 00420 csVector3& isect); // intersection point 00421 00428 static float SegmentZ0Plane ( 00429 const csSegment3& uv, 00430 csVector3& isect) // intersection point 00431 { 00432 return SegmentZ0Plane (uv.Start (), uv.End (), isect); 00433 } 00434 00441 static float SegmentXPlane ( 00442 const csVector3& u, const csVector3& v, 00443 float xval, 00444 csVector3& isect); // intersection point 00445 00452 static float SegmentXPlane ( 00453 const csSegment3& uv, 00454 float xval, 00455 csVector3& isect) // intersection point 00456 { 00457 return SegmentXPlane (uv.Start (), uv.End (), xval, isect); 00458 } 00459 00466 static float SegmentYPlane ( 00467 const csVector3& u, const csVector3& v, 00468 float yval, // plane y = yval 00469 csVector3& isect); // intersection point 00470 00477 static float SegmentYPlane ( 00478 const csSegment3& uv, 00479 float yval, // plane y = yval 00480 csVector3& isect) // intersection point 00481 { 00482 return SegmentYPlane (uv.Start (), uv.End (), yval, isect); 00483 } 00484 00491 static float SegmentZPlane ( 00492 const csVector3& u, const csVector3& v, 00493 float zval, // plane z = zval 00494 csVector3& isect); // intersection point 00495 00502 static float SegmentZPlane ( 00503 const csSegment3& uv, 00504 float zval, // plane z = zval 00505 csVector3& isect) // intersection point 00506 { 00507 return SegmentZPlane (uv.Start (), uv.End (), zval, isect); 00508 } 00509 00516 static float SegmentAxisPlane (const csVector3& u, const csVector3& v, 00517 int nr, float pos, csVector3& isect) 00518 { 00519 switch (nr) 00520 { 00521 case 0: return SegmentXPlane (u, v, pos, isect); 00522 case 1: return SegmentYPlane (u, v, pos, isect); 00523 case 2: return SegmentZPlane (u, v, pos, isect); 00524 } 00525 return 0.0; 00526 } 00527 00532 static float SegmentXFrustum ( 00533 const csVector3& u, const csVector3& v, float A, csVector3& isect); 00534 00539 static float SegmentXFrustum ( 00540 const csSegment3& uv, float A, csVector3& isect) 00541 { 00542 return SegmentXFrustum (uv.Start (), uv.End (), A, isect); 00543 } 00544 00549 static float SegmentYFrustum ( 00550 const csVector3& u, const csVector3& v, float B, csVector3& isect); 00551 00556 static float SegmentYFrustum ( 00557 const csSegment3& uv, float B, csVector3& isect) 00558 { 00559 return SegmentYFrustum (uv.Start (), uv.End (), B, isect); 00560 } 00561 00576 static int BoxSegment (const csBox3& box, const csSegment3& segment, 00577 csVector3& isect, float* pr = 0); 00578 00588 static bool BoxFrustum (const csBox3& box, csPlane3* frustum, 00589 uint32 inClipMask, uint32& outClipMask); 00590 00594 static bool BoxFrustum (const csBox3& box, const csFrustum* frustum); 00595 00600 static bool BoxSphere (const csBox3& box, const csVector3& center, 00601 float sqradius); 00602 00606 static bool BoxPlane (const csBox3& box, const csPlane3& plane); 00607 00612 static bool BoxPlane (const csBox3& box, const csVector3& normal, 00613 const csVector3& vert); 00614 00618 static bool BoxTriangle (const csBox3& box, 00619 const csVector3& tri0, const csVector3& tri1, const csVector3& tri2); 00620 00624 static bool BoxBox (const csBox3& box1, const csBox3& box2) 00625 { 00626 return box1.TestIntersect (box2); 00627 } 00628 00632 static csPtr<csFrustum> FrustumFrustum (const csFrustum& f1, 00633 const csFrustum& f2) 00634 { 00635 return f1.Intersect (f2); 00636 } 00637 00641 static csPtr<csFrustum> FrustumFrustum (const csFrustum& f1, 00642 csVector3* poly, int num) 00643 { 00644 return f1.Intersect (poly, num); 00645 } 00646 00653 static bool TriangleTriangle (const csVector3 tri1[3], 00654 const csVector3 tri2[3]); 00655 00665 static bool TriangleTriangle (const csVector3 tri1[3], 00666 const csVector3 tri2[3], 00667 csSegment3& isectline, bool& coplanar); 00668 }; 00669 00674 class CS_CRYSTALSPACE_EXPORT csGeomDebugHelper : 00675 public scfImplementation1<csGeomDebugHelper, iDebugHelper> 00676 { 00677 public: 00678 csGeomDebugHelper (); 00679 virtual ~csGeomDebugHelper (); 00680 00681 virtual int GetSupportedTests () const 00682 { 00683 return CS_DBGHELP_UNITTEST; 00684 } 00685 virtual csPtr<iString> UnitTest (); 00686 virtual csPtr<iString> StateTest () 00687 { 00688 return 0; 00689 } 00690 virtual csTicks Benchmark (int /*num_iterations*/) 00691 { 00692 return 0; 00693 } 00694 virtual csPtr<iString> Dump () 00695 { 00696 return 0; 00697 } 00698 virtual void Dump (iGraphics3D* /*g3d*/) 00699 { 00700 } 00701 virtual bool DebugCommand (const char*) 00702 { 00703 return false; 00704 } 00705 }; 00706 00709 #endif // __CS_MATH3D_H__ 00710
Generated for Crystal Space by doxygen 1.4.7