Quad.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /******************************************************************************
  2. Use 'Quad2' to handle 2D quads, Flt type
  3. Use 'Quad' to handle 3D quads, Flt type
  4. Use 'QuadD2' to handle 2D quads, Dbl type
  5. Use 'QuadD' to handle 3D quads, Dbl type
  6. /******************************************************************************/
  7. struct Quad2 // Quadrilateral 2D
  8. {
  9. Vec2 p[4]; // points
  10. Quad2& set(C Vec2 &p0, C Vec2 &p1, C Vec2 &p2, C Vec2 &p3) {p[0]=p0; p[1]=p1; p[2]=p2; p[3]=p3; return T;}
  11. // get
  12. Vec2 center ( )C {return Avg(p[0], p[1], p[2], p[3]);} // get quad center
  13. Flt area ( )C; // get surface area
  14. Bool convex ( )C; // if quad is convex
  15. Bool valid (Flt eps=EPS)C; // if quad is valid (points aren't inline)
  16. Bool clockwise( )C; // if points are in clockwise order
  17. Tri2 tri013()C {return Tri2(p[0], p[1], p[3]);}
  18. Tri2 tri123()C {return Tri2(p[1], p[2], p[3]);}
  19. Tri2 tri012()C {return Tri2(p[0], p[1], p[2]);}
  20. Tri2 tri230()C {return Tri2(p[2], p[3], p[0]);}
  21. // draw
  22. void draw(C Color &color=WHITE, Bool fill=true)C;
  23. Quad2& operator+=(C Vec2 &v);
  24. Quad2& operator-=(C Vec2 &v);
  25. Quad2& operator*=( Flt r);
  26. Quad2& operator/=( Flt r);
  27. friend Quad2 operator+ (C Quad2 &quad, C Vec2 &v) {return Quad2(quad)+=v;}
  28. friend Quad2 operator- (C Quad2 &quad, C Vec2 &v) {return Quad2(quad)-=v;}
  29. friend Quad2 operator* (C Quad2 &quad, Flt r) {return Quad2(quad)*=r;}
  30. friend Quad2 operator/ (C Quad2 &quad, Flt r) {return Quad2(quad)/=r;}
  31. Quad2() {}
  32. Quad2(C Vec2 &p0, C Vec2 &p1, C Vec2 &p2, C Vec2 &p3) {set(p0, p1, p2, p3);}
  33. };
  34. /******************************************************************************/
  35. struct QuadD2 // Quadrilateral 2D (double precision)
  36. {
  37. VecD2 p[4]; // points
  38. QuadD2& set(C VecD2 &p0, C VecD2 &p1, C VecD2 &p2, C VecD2 &p3) {p[0]=p0; p[1]=p1; p[2]=p2; p[3]=p3; return T;}
  39. // get
  40. VecD2 center ()C {return Avg(p[0], p[1], p[2], p[3]);} // get quad center
  41. Dbl area ()C; // get triangle surface area
  42. Bool clockwise()C; // if points are in clockwise order
  43. TriD2 tri013()C {return TriD2(p[0], p[1], p[3]);}
  44. TriD2 tri123()C {return TriD2(p[1], p[2], p[3]);}
  45. TriD2 tri012()C {return TriD2(p[0], p[1], p[2]);}
  46. TriD2 tri230()C {return TriD2(p[2], p[3], p[0]);}
  47. QuadD2& operator+=(C VecD2 &v);
  48. QuadD2& operator-=(C VecD2 &v);
  49. QuadD2& operator*=( Dbl r);
  50. QuadD2& operator/=( Dbl r);
  51. friend QuadD2 operator+ (C QuadD2 &quad, C VecD2 &v) {return QuadD2(quad)+=v;}
  52. friend QuadD2 operator- (C QuadD2 &quad, C VecD2 &v) {return QuadD2(quad)-=v;}
  53. friend QuadD2 operator* (C QuadD2 &quad, Dbl r) {return QuadD2(quad)*=r;}
  54. friend QuadD2 operator/ (C QuadD2 &quad, Dbl r) {return QuadD2(quad)/=r;}
  55. QuadD2() {}
  56. QuadD2(C VecD2 &p0, C VecD2 &p1, C VecD2 &p2, C VecD2 &p3) {set(p0, p1, p2, p3);}
  57. };
  58. /******************************************************************************/
  59. struct Quad // Quadrilateral 3D
  60. {
  61. Vec p[4], // points
  62. n ; // normal
  63. Quad& set (C Vec &p0, C Vec &p1, C Vec &p2, C Vec &p3, C Vec *normal=null);
  64. Quad& setNormal( ) {n=GetNormal(p[0], p[1], p[3]); return T;} // recalculate normal
  65. // get
  66. Vec center ( )C {return Avg(p[0], p[1], p[2], p[3]);} // get quad center
  67. Flt area ( )C; // get quad surface area
  68. Bool convex ( )C; // if quad is convex
  69. Bool valid (Flt eps=EPS )C; // if quad is valid (points aren't inline)
  70. Bool coplanar(C Quad &quad)C; // if quads are coplanar
  71. Tri tri013()C {return Tri(p[0], p[1], p[3]);}
  72. Tri tri123()C {return Tri(p[1], p[2], p[3]);}
  73. Tri tri012()C {return Tri(p[0], p[1], p[2]);}
  74. Tri tri230()C {return Tri(p[2], p[3], p[0]);}
  75. // draw
  76. void draw(C Color &color=WHITE, Bool fill=false)C; // this relies on active object matrix which can be set using 'SetMatrix' function
  77. Quad& operator+=(C Vec &v);
  78. Quad& operator-=(C Vec &v);
  79. Quad& operator*=( Flt r);
  80. Quad& operator/=( Flt r);
  81. friend Quad operator+ (C Quad &quad, C Vec &v) {return Quad(quad)+=v;}
  82. friend Quad operator- (C Quad &quad, C Vec &v) {return Quad(quad)-=v;}
  83. friend Quad operator* (C Quad &quad, Flt r) {return Quad(quad)*=r;}
  84. friend Quad operator/ (C Quad &quad, Flt r) {return Quad(quad)/=r;}
  85. Quad() {}
  86. Quad(C Vec &p0, C Vec &p1, C Vec &p2, C Vec &p3, C Vec *normal=null) {set(p0, p1, p2, p3, normal);}
  87. Quad(C QuadD &quad);
  88. };
  89. /******************************************************************************/
  90. struct QuadD // Quadrilateral 3D (double precision)
  91. {
  92. VecD p[4], // points
  93. n ; // normal
  94. QuadD& set (C VecD &p0, C VecD &p1, C VecD &p2, C VecD &p3, C VecD *normal=null);
  95. QuadD& setNormal( ) {n=GetNormal(p[0], p[1], p[3]); return T;} // recalculate normal
  96. // get
  97. VecD center()C {return Avg(p[0], p[1], p[2], p[3]);} // get quad center
  98. Dbl area ()C; // get quad surface area
  99. TriD tri013()C {return TriD(p[0], p[1], p[3]);}
  100. TriD tri123()C {return TriD(p[1], p[2], p[3]);}
  101. TriD tri012()C {return TriD(p[0], p[1], p[2]);}
  102. TriD tri230()C {return TriD(p[2], p[3], p[0]);}
  103. QuadD& operator+=(C VecD &v);
  104. QuadD& operator-=(C VecD &v);
  105. QuadD& operator*=( Dbl r);
  106. QuadD& operator/=( Dbl r);
  107. friend QuadD operator+ (C QuadD &quad, C VecD &v) {return QuadD(quad)+=v;}
  108. friend QuadD operator- (C QuadD &quad, C VecD &v) {return QuadD(quad)-=v;}
  109. friend QuadD operator* (C QuadD &quad, Dbl r) {return QuadD(quad)*=r;}
  110. friend QuadD operator/ (C QuadD &quad, Dbl r) {return QuadD(quad)/=r;}
  111. QuadD() {}
  112. QuadD(C VecD &p0, C VecD &p1, C VecD &p2, C VecD &p3, C VecD *normal=null) {set(p0, p1, p2, p3, normal);}
  113. QuadD(C Quad &quad);
  114. };
  115. /******************************************************************************/
  116. // distance between point and a quad, if you're sure that quad's are fully valid (their triangles are coplanar) set 'test_quads_as_2_tris'=false for performance boost
  117. Flt Dist(C Vec2 &point, C Quad2 &quad, DIST_TYPE *type=null);
  118. Flt Dist(C Vec &point, C Quad &quad, DIST_TYPE *type=null, Bool test_quads_as_2_tris=true);
  119. // distance between point and a plane (from quad)
  120. inline Flt DistPointPlane(C Vec &point, C Quad &quad) {return DistPointPlane(point, quad.p[0], quad.n);}
  121. inline Dbl DistPointPlane(C VecD &point, C QuadD &quad) {return DistPointPlane(point, quad.p[0], quad.n);}
  122. // if point cuts quad assuming they're coplanar (epsilon=0), if you're sure that quad's are fully valid (their triangles are coplanar) set 'test_quads_as_2_tris'=false for performance boost
  123. Bool Cuts(C Vec2 &point, C Quad2 &quad );
  124. Bool Cuts(C Vec &point, C Quad &quad, Bool test_quads_as_2_tris=true);
  125. // if point cuts quad assuming they're coplanar (epsilon=EPS), if you're sure that quad's are fully valid (their triangles are coplanar) set 'test_quads_as_2_tris'=false for performance boost
  126. Bool CutsEps(C Vec2 &point, C Quad2 &quad );
  127. Bool CutsEps(C Vec &point, C Quad &quad, Bool test_quads_as_2_tris=true);
  128. // if moving point cuts through static quad (epsilon=0)
  129. Bool SweepPointQuad(C Vec &point, C Vec &move, C Quad &quad, Flt *hit_frac=null, Vec *hit_pos=null, Bool test_quads_as_2_tris=true, Bool two_sided=false); // if you're sure that quad's are fully valid (their triangles are coplanar) set 'test_quads_as_2_tris'=false for performance boost
  130. // if moving point cuts through static quad (epsilon=EPS)
  131. Bool SweepPointQuadEps(C Vec &point, C Vec &move, C Quad &quad, Flt *hit_frac=null, Vec *hit_pos=null, Bool test_quads_as_2_tris=true, Bool two_sided=false); // if you're sure that quad's are fully valid (their triangles are coplanar) set 'test_quads_as_2_tris'=false for performance boost
  132. /******************************************************************************/