Edge.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. /******************************************************************************
  2. Use 'Edge2' to handle 2D edges, Flt type
  3. Use 'Edge' to handle 3D edges, Flt type
  4. Use 'EdgeD2' to handle 2D edges, Dbl type
  5. Use 'EdgeD' to handle 3D edges, Dbl type
  6. /******************************************************************************/
  7. struct Edge2 // Edge 2D
  8. {
  9. Vec2 p[2]; // points
  10. // set
  11. Edge2& set(C Vec2 &p0 , C Vec2 &p1 ) {p[0]=p0 ; p[1]=p1 ; return T;}
  12. Edge2& set(Flt x0, Flt y0, Flt x1, Flt y1) {p[0].set(x0,y0); p[1].set(x1,y1); return T;}
  13. // get
  14. Flt centerX( )C {return Avg(p[0].x, p[1].x);} // center x
  15. Flt centerY( )C {return Avg(p[0].y, p[1].y);} // center y
  16. Vec2 center ( )C {return Vec2(centerX(), centerY());} // center
  17. Vec2 delta ( )C {return p[1]-p[0];} // delta
  18. Vec2 dir ( )C {return !delta() ;} // direction
  19. Vec2 perp ( )C {return Perp (delta());} // perpendicular
  20. Vec2 perpN ( )C {return PerpN(delta());} // perpendicular normalized
  21. Flt length ( )C {return Dist(p[0] , p[1] );} // length
  22. Vec2 lerp (Flt s)C {return Lerp(p[0] , p[1] , s);} // lerp from p[0] to p[1]
  23. Flt lerpX (Flt s)C {return Lerp(p[0].x, p[1].x, s);} // lerp from p[0].x to p[1].x
  24. Flt lerpY (Flt s)C {return Lerp(p[0].y, p[1].y, s);} // lerp from p[0].y to p[1].y
  25. Str asText()C {return S+"Point0: "+p[0]+", Point1: "+p[1];} // get text description
  26. // operations
  27. Edge2& reverse() {Swap(p[0], p[1]); return T;} // reverse the order of points
  28. // transform
  29. Edge2& operator+=(C Vec2 &v) {p[0]+=v; p[1]+=v; return T;}
  30. Edge2& operator-=(C Vec2 &v) {p[0]-=v; p[1]-=v; return T;}
  31. Edge2& operator*=( Flt f) {p[0]*=f; p[1]*=f; return T;}
  32. Edge2& operator/=( Flt f) {p[0]/=f; p[1]/=f; return T;}
  33. Edge2& operator*=(C Vec2 &v) {p[0]*=v; p[1]*=v; return T;}
  34. Edge2& operator/=(C Vec2 &v) {p[0]/=v; p[1]/=v; return T;}
  35. Edge2& operator*=(C Matrix3 &m) {p[0]*=m; p[1]*=m; return T;}
  36. Edge2& operator*=(C Matrix &m) {p[0]*=m; p[1]*=m; return T;}
  37. friend Edge2 operator+ (C Edge2 &edge, C Vec2 &v) {return Edge2(edge)+=v;}
  38. friend Edge2 operator- (C Edge2 &edge, C Vec2 &v) {return Edge2(edge)-=v;}
  39. friend Edge2 operator* (C Edge2 &edge, Flt f) {return Edge2(edge)*=f;}
  40. friend Edge2 operator/ (C Edge2 &edge, Flt f) {return Edge2(edge)/=f;}
  41. friend Edge2 operator* (C Edge2 &edge, C Vec2 &v) {return Edge2(edge)*=v;}
  42. friend Edge2 operator/ (C Edge2 &edge, C Vec2 &v) {return Edge2(edge)/=v;}
  43. friend Edge2 operator* (C Edge2 &edge, C Matrix3 &m) {return Edge2(edge)*=m;}
  44. friend Edge2 operator* (C Edge2 &edge, C Matrix &m) {return Edge2(edge)*=m;}
  45. // draw
  46. void draw(C Color &color=WHITE )C; // draw
  47. void draw(C Color &color , Flt width )C; // draw with width
  48. void draw(C Color &color0, C Color &color1)C; // draw with per-point color
  49. Edge2() {}
  50. Edge2(C Vec2 &p ) {set(p , p);}
  51. Edge2(C Vec2 &p0, C Vec2 &p1 ) {set(p0, p1);}
  52. Edge2( Flt x0, Flt y0, Flt x1, Flt y1) {set(x0, y0, x1, y1);}
  53. Edge2(C EdgeD2 &edge );
  54. };
  55. /******************************************************************************/
  56. struct EdgeD2 // Edge 2D (double precision)
  57. {
  58. VecD2 p[2]; // points
  59. // set
  60. EdgeD2& set(C VecD2 &p0 , C VecD2 &p1 ) {p[0]=p0 ; p[1]=p1 ; return T;}
  61. EdgeD2& set(Dbl x0, Dbl y0, Dbl x1, Dbl y1) {p[0].set(x0,y0); p[1].set(x1,y1); return T;}
  62. // get
  63. Dbl centerX( )C {return Avg(p[0].x, p[1].x);} // center x
  64. Dbl centerY( )C {return Avg(p[0].y, p[1].y);} // center y
  65. VecD2 center ( )C {return VecD2(centerX(), centerY());} // center
  66. VecD2 delta ( )C {return p[1]-p[0];} // delta
  67. VecD2 dir ( )C {return !delta() ;} // direction
  68. VecD2 perp ( )C {return Perp (delta());} // perpendicular
  69. VecD2 perpN ( )C {return PerpN(delta());} // perpendicular normalized
  70. Dbl length ( )C {return Dist(p[0] , p[1] );} // length
  71. VecD2 lerp (Dbl s)C {return Lerp(p[0] , p[1] , s);} // lerp from p[0] to p[1]
  72. Dbl lerpX (Dbl s)C {return Lerp(p[0].x, p[1].x, s);} // lerp from p[0].x to p[1].x
  73. Dbl lerpY (Dbl s)C {return Lerp(p[0].y, p[1].y, s);} // lerp from p[0].y to p[1].y
  74. // draw
  75. void draw(C Color &color=WHITE )C; // draw
  76. void draw(C Color &color , Flt width )C; // draw with width
  77. void draw(C Color &color0, C Color &color1)C; // draw with per-point color
  78. // operations
  79. EdgeD2& reverse() {Swap(p[0], p[1]); return T;} // reverse the order of points
  80. // transform
  81. EdgeD2& operator+=(C VecD2 &v) {p[0]+=v; p[1]+=v; return T;}
  82. EdgeD2& operator-=(C VecD2 &v) {p[0]-=v; p[1]-=v; return T;}
  83. EdgeD2& operator*=( Dbl r) {p[0]*=r; p[1]*=r; return T;}
  84. EdgeD2& operator/=( Dbl r) {p[0]/=r; p[1]/=r; return T;}
  85. EdgeD2& operator*=(C MatrixD &m) {p[0]*=m; p[1]*=m; return T;}
  86. friend EdgeD2 operator+ (C EdgeD2 &edge, C VecD2 &v) {return EdgeD2(edge)+=v;}
  87. friend EdgeD2 operator- (C EdgeD2 &edge, C VecD2 &v) {return EdgeD2(edge)-=v;}
  88. friend EdgeD2 operator* (C EdgeD2 &edge, Dbl r) {return EdgeD2(edge)*=r;}
  89. friend EdgeD2 operator/ (C EdgeD2 &edge, Dbl r) {return EdgeD2(edge)/=r;}
  90. friend EdgeD2 operator* (C EdgeD2 &edge, C MatrixD &m) {return EdgeD2(edge)*=m;}
  91. EdgeD2() {}
  92. EdgeD2(C VecD2 &p ) {set(p , p );}
  93. EdgeD2(C VecD2 &p0, C VecD2 &p1 ) {set(p0, p1);}
  94. EdgeD2( Dbl x0, Dbl y0, Dbl x1, Dbl y1) {set(x0, y0, x1, y1);}
  95. EdgeD2(C Edge2 &edge);
  96. };
  97. /******************************************************************************/
  98. struct Edge // Edge 3D
  99. {
  100. Vec p[2]; // points
  101. // set
  102. Edge& set(C Vec &p0, C Vec &p1 ) {p[0]=p0 ; p[1]=p1 ; return T;}
  103. Edge& set(C Vec2 &p0, C Vec2 &p1, Flt z) {p[0].set(p0 , z); p[1].set(p1 , z); return T;}
  104. Edge& set(C Edge2 &edge , Flt z) {p[0].set(edge.p[0], z); p[1].set(edge.p[1], z); return T;}
  105. // get
  106. Edge2 xy ( )C {return Edge2(p[0].xy , p[1].xy );} // get XY components as Edge2
  107. Edge2 xz ( )C {return Edge2(p[0].xz(), p[1].xz());} // get XZ components as Edge2
  108. Flt centerX( )C {return Avg(p[0].x , p[1].x );} // center x
  109. Flt centerY( )C {return Avg(p[0].y , p[1].y );} // center y
  110. Flt centerZ( )C {return Avg(p[0].z , p[1].z );} // center z
  111. Vec center ( )C {return Vec(centerX(), centerY(), centerZ());} // center
  112. Vec delta ( )C {return p[1]-p[0];} // delta
  113. Vec dir ( )C {return !delta();} // direction
  114. Flt length ( )C {return Dist(p[0] , p[1] );} // length
  115. Vec lerp (Flt s)C {return Lerp(p[0] , p[1] , s);} // lerp from p[0] to p[1]
  116. Flt lerpX (Flt s)C {return Lerp(p[0].x, p[1].x, s);} // lerp from p[0].x to p[1].x
  117. Flt lerpY (Flt s)C {return Lerp(p[0].y, p[1].y, s);} // lerp from p[0].y to p[1].y
  118. Flt lerpZ (Flt s)C {return Lerp(p[0].z, p[1].z, s);} // lerp from p[0].z to p[1].z
  119. Str asText()C {return S+"Point0: "+p[0]+", Point1: "+p[1];} // get text description
  120. // operations
  121. Edge& reverse() {Swap(p[0], p[1]); return T;} // reverse the order of points
  122. // transform
  123. Edge& operator+=(C Vec &v) {p[0]+=v; p[1]+=v; return T;}
  124. Edge& operator-=(C Vec &v) {p[0]-=v; p[1]-=v; return T;}
  125. Edge& operator*=( Flt f) {p[0]*=f; p[1]*=f; return T;}
  126. Edge& operator/=( Flt f) {p[0]/=f; p[1]/=f; return T;}
  127. Edge& operator*=(C Vec &v) {p[0]*=v; p[1]*=v; return T;}
  128. Edge& operator/=(C Vec &v) {p[0]/=v; p[1]/=v; return T;}
  129. Edge& operator*=(C Matrix3 &m) {p[0]*=m; p[1]*=m; return T;}
  130. Edge& operator*=(C Matrix &m) {p[0]*=m; p[1]*=m; return T;}
  131. Edge& operator/=(C Matrix3 &m) {return div(m);}
  132. Edge& operator/=(C Matrix &m) {return div(m);}
  133. friend Edge operator+ (C Edge &edge, C Vec &v) {return Edge(edge)+=v;}
  134. friend Edge operator- (C Edge &edge, C Vec &v) {return Edge(edge)-=v;}
  135. friend Edge operator* (C Edge &edge, Flt f) {return Edge(edge)*=f;}
  136. friend Edge operator/ (C Edge &edge, Flt f) {return Edge(edge)/=f;}
  137. friend Edge operator* (C Edge &edge, C Vec &v) {return Edge(edge)*=v;}
  138. friend Edge operator/ (C Edge &edge, C Vec &v) {return Edge(edge)/=v;}
  139. friend Edge operator* (C Edge &edge, C Matrix3 &m) {return Edge(edge)*=m;}
  140. friend Edge operator/ (C Edge &edge, C Matrix3 &m) {return Edge(edge)/=m;}
  141. friend Edge operator* (C Edge &edge, C Matrix &m) {return Edge(edge)*=m;}
  142. friend Edge operator/ (C Edge &edge, C Matrix &m) {return Edge(edge)/=m;}
  143. Edge& div (C Matrix3 &matrix); // transform by matrix inverse
  144. Edge& div (C Matrix &matrix); // transform by matrix inverse
  145. Edge& divNormalized(C Matrix3 &matrix); // transform by matrix inverse, this method is faster than 'div' however 'matrix' must be normalized
  146. Edge& divNormalized(C Matrix &matrix); // transform by matrix inverse, this method is faster than 'div' however 'matrix' must be normalized
  147. // draw
  148. void draw(C Color &color=WHITE )C; // draw , this relies on active object matrix which can be set using 'SetMatrix' function
  149. void draw(C Color &color , Flt width )C; // draw with width , this relies on active object matrix which can be set using 'SetMatrix' function
  150. void draw(C Color &color0, C Color &color1)C; // draw with per-point color, this relies on active object matrix which can be set using 'SetMatrix' function
  151. Edge() {}
  152. Edge(C Vec &p ) {set(p , p );}
  153. Edge(C Vec &p0, C Vec &p1 ) {set(p0, p1 );}
  154. Edge(C Vec2 &p0, C Vec2 &p1, Flt z) {set(p0, p1, z);}
  155. Edge(C Edge2 &edge , Flt z) {set(edge , z);}
  156. Edge(C EdgeD &edge );
  157. };
  158. /******************************************************************************/
  159. struct EdgeD // Edge 3D (double precision)
  160. {
  161. VecD p[2]; // points
  162. // set
  163. EdgeD& set(C VecD &p0, C VecD &p1 ) {p[0]=p0 ; p[1]=p1 ; return T;}
  164. EdgeD& set(C VecD2 &p0, C VecD2 &p1, Dbl z) {p[0].set(p0,z); p[1].set(p1,z); return T;}
  165. // get
  166. Dbl centerX( )C {return Avg(p[0].x, p[1].x);} // center x
  167. Dbl centerY( )C {return Avg(p[0].y, p[1].y);} // center y
  168. Dbl centerZ( )C {return Avg(p[0].z, p[1].z);} // center z
  169. VecD center ( )C {return VecD(centerX(), centerY(), centerZ());} // center
  170. VecD delta ( )C {return p[1]-p[0];} // delta
  171. VecD dir ( )C {return !delta();} // direction
  172. Dbl length ( )C {return Dist(p[0] , p[1] );} // length
  173. VecD lerp (Dbl s)C {return Lerp(p[0] , p[1] , s);} // lerp from p[0] to p[1]
  174. Dbl lerpX (Dbl s)C {return Lerp(p[0].x, p[1].x, s);} // lerp from p[0].x to p[1].x
  175. Dbl lerpY (Dbl s)C {return Lerp(p[0].y, p[1].y, s);} // lerp from p[0].y to p[1].y
  176. Dbl lerpZ (Dbl s)C {return Lerp(p[0].z, p[1].z, s);} // lerp from p[0].z to p[1].z
  177. // operations
  178. EdgeD& reverse() {Swap(p[0], p[1]); return T;} // reverse the order of points
  179. // transform
  180. EdgeD& operator+=(C VecD &v) {p[0]+=v; p[1]+=v; return T;}
  181. EdgeD& operator-=(C VecD &v) {p[0]-=v; p[1]-=v; return T;}
  182. EdgeD& operator*=( Dbl r) {p[0]*=r; p[1]*=r; return T;}
  183. EdgeD& operator/=( Dbl r) {p[0]/=r; p[1]/=r; return T;}
  184. EdgeD& operator*=(C MatrixD &m) {p[0]*=m; p[1]*=m; return T;}
  185. friend EdgeD operator+ (C EdgeD &edge, C VecD &v) {return EdgeD(edge)+=v;}
  186. friend EdgeD operator- (C EdgeD &edge, C VecD &v) {return EdgeD(edge)-=v;}
  187. friend EdgeD operator* (C EdgeD &edge, Dbl r) {return EdgeD(edge)*=r;}
  188. friend EdgeD operator/ (C EdgeD &edge, Dbl r) {return EdgeD(edge)/=r;}
  189. friend EdgeD operator* (C EdgeD &edge, C MatrixD &m) {return EdgeD(edge)*=m;}
  190. // draw
  191. void draw(C Color &color=WHITE )C; // draw , this relies on active object matrix which can be set using 'SetMatrix' function
  192. void draw(C Color &color , Flt width )C; // draw with width , this relies on active object matrix which can be set using 'SetMatrix' function
  193. void draw(C Color &color0, C Color &color1)C; // draw with per-point color, this relies on active object matrix which can be set using 'SetMatrix' function
  194. EdgeD() {}
  195. EdgeD(C VecD &p ) {set(p , p );}
  196. EdgeD(C VecD &p0, C VecD &p1) {set(p0, p1);}
  197. EdgeD(C Edge &edge );
  198. };
  199. /******************************************************************************/
  200. struct Edge2_I : Edge2 // Edge 2D + information
  201. {
  202. Flt length; // length
  203. Vec2 dir , // direction
  204. normal; // normal
  205. // set
  206. void set(C Vec2 &a, C Vec2 &b, C Vec2 *normal=null);
  207. void set(C Edge2 &edge ) {set(edge.p[0], edge.p[1]);}
  208. Edge2_I() {}
  209. Edge2_I(C Vec2 &a, C Vec2 &b, C Vec2 *normal=null){set(a, b, normal);}
  210. Edge2_I(C Edge2 &edge ){set(edge );}
  211. };
  212. /******************************************************************************/
  213. struct EdgeD2_I : EdgeD2 // Edge 2D + information (double precision)
  214. {
  215. Dbl length; // length
  216. VecD2 dir , // direction
  217. normal; // normal
  218. // set
  219. void set(C VecD2 &a, C VecD2 &b, C VecD2 *normal=null);
  220. void set(C EdgeD2 &edge ) {set(edge.p[0], edge.p[1]);}
  221. EdgeD2_I() {}
  222. EdgeD2_I(C VecD2 &a, C VecD2 &b, C VecD2 *normal=null) {set(a, b, normal);}
  223. EdgeD2_I(C EdgeD2 &edge ) {set(edge );}
  224. };
  225. /******************************************************************************/
  226. struct Edge_I : Edge // Edge 3D + information
  227. {
  228. Flt length; // length
  229. Vec dir ; // direction
  230. // set
  231. void set(C Vec &a, C Vec &b);
  232. void set(C Edge &edge ) {set(edge.p[0], edge.p[1]);}
  233. Edge_I() {}
  234. Edge_I(C Vec &a, C Vec &b) {set(a, b);}
  235. Edge_I(C Edge &edge ) {set(edge);}
  236. };
  237. /******************************************************************************/
  238. struct EdgeD_I : EdgeD // Edge 3D + information (double precision)
  239. {
  240. Dbl length; // length
  241. VecD dir ; // direction
  242. // set
  243. void set(C VecD &a, C VecD &b);
  244. void set(C EdgeD &edge ) {set(edge.p[0], edge.p[1]);}
  245. EdgeD_I() {}
  246. EdgeD_I(C VecD &a, C VecD &b) {set(a, b);}
  247. EdgeD_I(C EdgeD &edge ) {set(edge);}
  248. };
  249. /******************************************************************************/
  250. struct PixelWalker // iterates through pixels of a rasterized edge
  251. {
  252. // get
  253. Bool active ()C {return _active ;} // if walker still active
  254. Bool sideStep()C {return _side_step;} // if last move was a side step (not along the main axis)
  255. C VecI2& pos ()C {return _pos_temp ;} // get current position
  256. // set
  257. void start(C VecI2 &start, C VecI2 &end); // start walking from 'start' to 'end'
  258. void start(C Vec2 &start, C Vec2 &end); // start walking from 'start' to 'end'
  259. // operations
  260. void step(); // make a single step
  261. PixelWalker( ) {_active=false;}
  262. PixelWalker(C VecI2 &start, C VecI2 &end) {_active=false; T.start(start, end);}
  263. PixelWalker(C Vec2 &start, C Vec2 &end) {_active=false; T.start(start, end);}
  264. #if !EE_PRIVATE
  265. private:
  266. #endif
  267. Bool _active, _axis, _side_step;
  268. Int _steps , _main_sign;
  269. VecI2 _pos , _pos_temp;
  270. Vec2 _posr, _step;
  271. };
  272. STRUCT(PixelWalkerMask , PixelWalker) // iterates through pixels of a rasterized edge only within a specified mask
  273. //{
  274. // set
  275. void start(C VecI2 &start, C VecI2 &end, C RectI &mask); // start walking from 'start' to 'end', 'mask'=process pixels only within this inclusive rectangle
  276. void start(C Vec2 &start, C Vec2 &end, C RectI &mask); // start walking from 'start' to 'end', 'mask'=process pixels only within this inclusive rectangle
  277. // operations
  278. void step(); // make a single step
  279. PixelWalkerMask( ) {}
  280. PixelWalkerMask(C VecI2 &start, C VecI2 &end, C RectI &mask) {T.start(start, end, mask);}
  281. PixelWalkerMask(C Vec2 &start, C Vec2 &end, C RectI &mask) {T.start(start, end, mask);}
  282. private:
  283. RectI _mask;
  284. };
  285. /******************************************************************************/
  286. struct PixelWalkerEdge // iterates through pixels of a rasterized line and returns intersections with the edges
  287. {
  288. // get
  289. Bool active ()C {return _active ;} // if walker still active
  290. Bool sideStep()C {return _side_step;} // if last move was a side step (not along the main axis)
  291. C Vec2& pos ()C {return _posr ;} // get current position
  292. // set
  293. void start(C Vec2 &start, C Vec2 &end); // start walking from 'start' to 'end'
  294. // operations
  295. void step(); // make a single step
  296. PixelWalkerEdge( ) {_active=false;}
  297. PixelWalkerEdge(C Vec2 &start, C Vec2 &end) {_active=false; T.start(start, end);}
  298. #if !EE_PRIVATE
  299. private:
  300. #endif
  301. Bool _active, _axis, _side_step;
  302. Int _steps, _pos;
  303. Vec2 _posr, _pos_next, _step, _pos_end;
  304. };
  305. STRUCT(PixelWalkerEdgeMask , PixelWalkerEdge) // iterates through pixels of a rasterized line and returns intersections with the edges only within a specified mask
  306. //{
  307. // set
  308. void start(C Vec2 &start, C Vec2 &end, C RectI &mask); // start walking from 'start' to 'end', 'mask'=process pixels only within this inclusive rectangle
  309. // operations
  310. void step(); // make a single step
  311. PixelWalkerEdgeMask( ) {}
  312. PixelWalkerEdgeMask(C Vec2 &start, C Vec2 &end, C RectI &mask) {T.start(start, end, mask);}
  313. private:
  314. Rect _mask;
  315. };
  316. /******************************************************************************/
  317. struct VoxelWalker // iterates through voxels of a rasterized edge
  318. {
  319. // get
  320. Bool active ()C {return _active ;} // if walker still active
  321. Bool sideStep()C {return _side_step!=0;} // if last move was a side step (not along the main axis)
  322. C VecI& pos ()C {return _pos_temp ;} // get current position
  323. // set
  324. void start(C VecI &start, C VecI &end); // start walking from 'start' to 'end'
  325. void start(C Vec &start, C Vec &end); // start walking from 'start' to 'end'
  326. // operations
  327. void step(); // make a single step
  328. VoxelWalker( ) {_active=false;}
  329. VoxelWalker(C VecI &start, C VecI &end) {_active=false; T.start(start, end);}
  330. VoxelWalker(C Vec &start, C Vec &end) {_active=false; T.start(start, end);}
  331. private:
  332. Bool _active;
  333. Byte _side_step;
  334. Int _steps, _main_sign;
  335. VecI _axis; // 0, 1, 2 axis sorted by most important movement
  336. VecI _pos , _pos_temp;
  337. Vec _posr, _step;
  338. };
  339. /******************************************************************************/
  340. inline Edge2 ::Edge2 (C EdgeD2 &edge){p[0]=edge.p[0]; p[1]=edge.p[1];}
  341. inline EdgeD2::EdgeD2(C Edge2 &edge){p[0]=edge.p[0]; p[1]=edge.p[1];}
  342. inline Edge ::Edge (C EdgeD &edge){p[0]=edge.p[0]; p[1]=edge.p[1];}
  343. inline EdgeD ::EdgeD (C Edge &edge){p[0]=edge.p[0]; p[1]=edge.p[1];}
  344. /******************************************************************************/
  345. // distance between point and a straight line
  346. Flt DistPointStr(C Vec2 &point, C Vec2 &str, C Vec2 &dir);
  347. Dbl DistPointStr(C VecD2 &point, C VecD2 &str, C VecD2 &dir);
  348. Flt DistPointStr(C Vec &point, C Vec &str, C Vec &dir);
  349. Dbl DistPointStr(C VecD &point, C Vec &str, C Vec &dir);
  350. Dbl DistPointStr(C VecD &point, C VecD &str, C VecD &dir);
  351. // distance between 2 straight lines
  352. Flt DistStrStr(C Vec &pos_a, C Vec &dir_a, C Vec &pos_b, C Vec &dir_b);
  353. // distance between point and an edge
  354. Flt DistPointEdge(C Vec2 &point, C Vec2 &edge_a, C Vec2 &edge_b, DIST_TYPE *type=null);
  355. Dbl DistPointEdge(C VecD2 &point, C VecD2 &edge_a, C VecD2 &edge_b, DIST_TYPE *type=null);
  356. Flt DistPointEdge(C Vec &point, C Vec &edge_a, C Vec &edge_b, DIST_TYPE *type=null);
  357. Dbl DistPointEdge(C VecD &point, C Vec &edge_a, C Vec &edge_b, DIST_TYPE *type=null);
  358. Dbl DistPointEdge(C VecD &point, C VecD &edge_a, C VecD &edge_b, DIST_TYPE *type=null);
  359. inline Flt Dist (C Vec2 &point, C Edge2 &edge , DIST_TYPE *type=null) {return DistPointEdge(point, edge.p[0], edge.p[1], type);}
  360. inline Dbl Dist (C VecD2 &point, C EdgeD2 &edge , DIST_TYPE *type=null) {return DistPointEdge(point, edge.p[0], edge.p[1], type);}
  361. inline Flt Dist (C Vec &point, C Edge &edge , DIST_TYPE *type=null) {return DistPointEdge(point, edge.p[0], edge.p[1], type);}
  362. inline Dbl Dist (C VecD &point, C EdgeD &edge , DIST_TYPE *type=null) {return DistPointEdge(point, edge.p[0], edge.p[1], type);}
  363. // distance between 2 edges
  364. Flt Dist(C Edge2 &a, C Edge2 &b);
  365. Flt Dist(C Edge &a, C Edge &b);
  366. // distance between edge and a plane
  367. Flt Dist(C Edge &edge, C Plane &plane);
  368. Vec2 NearestPointOnEdge(C Vec2 &point, C Vec2 &edge_a, C Vec2 &edge_b); // nearest point on edge
  369. Vec NearestPointOnEdge(C Vec &point, C Vec &edge_a, C Vec &edge_b); // nearest point on edge
  370. inline Vec2 NearestPointOnEdge(C Vec2 &point, C Edge2 &edge ) {return NearestPointOnEdge(point, edge.p[0], edge.p[1]);} // nearest point on edge
  371. inline Vec NearestPointOnEdge(C Vec &point, C Edge &edge ) {return NearestPointOnEdge(point, edge.p[0], edge.p[1]);} // nearest point on edge
  372. Vec NearestPointOnStr (C Vec &point, C Vec &str , C Vec &dir ); // nearest point on straight line
  373. Bool NearestPointOnStr (C Vec &pos_a, C Vec &dir_a, C Vec &pos_b, C Vec &dir_b, Edge &out); // nearest points on straight lines, return true is succesfull, put points to out.p[]
  374. // if points cuts edge (with epsilon)
  375. Bool CutsPointEdge(C Vec2 &point, C Edge2_I &ei , Vec2 *cuts=null);
  376. Bool CutsPointEdge(C VecD2 &point, C EdgeD2_I &ei , VecD2 *cuts=null);
  377. Bool CutsPointEdge(C Vec &point, C Edge_I &ei , Vec *cuts=null);
  378. Bool CutsPointEdge(C VecD &point, C EdgeD_I &ei , VecD *cuts=null);
  379. inline Bool Cuts (C Vec2 &point, C Edge2 &edge, Vec2 *cuts=null) {return CutsPointEdge(point, Edge2_I (edge), cuts);}
  380. inline Bool Cuts (C VecD2 &point, C EdgeD2 &edge, VecD2 *cuts=null) {return CutsPointEdge(point, EdgeD2_I(edge), cuts);}
  381. inline Bool Cuts (C Vec &point, C Edge &edge, Vec *cuts=null) {return CutsPointEdge(point, Edge_I (edge), cuts);}
  382. inline Bool Cuts (C VecD &point, C EdgeD &edge, VecD *cuts=null) {return CutsPointEdge(point, EdgeD_I (edge), cuts);}
  383. // if edge cuts edge (with epsilon)
  384. Int CutsEdgeEdge(C Edge2_I &a, C Edge2_I &b, Edge2 *cuts=null);
  385. Int CutsEdgeEdge(C EdgeD2_I &a, C EdgeD2_I &b, EdgeD2 *cuts=null);
  386. Int CutsEdgeEdge(C Edge_I &a, C Edge_I &b, Edge *cuts=null);
  387. Int CutsEdgeEdge(C EdgeD_I &a, C EdgeD_I &b, EdgeD *cuts=null);
  388. // if edge cuts plane (with epsilon)
  389. Bool Cuts(C Edge &edge, C Plane &plane, Vec *cuts=null);
  390. Bool Cuts(C EdgeD &edge, C PlaneM &plane, VecD *cuts=null);
  391. // clip edge to plane (no epsilon)
  392. Bool Clip(Edge2 &edge, C Plane2 &plane);
  393. Bool Clip(EdgeD2 &edge, C PlaneD2 &plane);
  394. Bool Clip(Edge &edge, C Plane &plane);
  395. Bool Clip(EdgeD &edge, C PlaneD &plane);
  396. // clip edge to plane (with epsilon)
  397. Bool ClipEps(Edge2 &edge, C Plane2 &plane);
  398. Bool ClipEps(EdgeD2 &edge, C PlaneD2 &plane);
  399. Bool ClipEps(Edge &edge, C Plane &plane);
  400. Bool ClipEps(EdgeD &edge, C PlaneD &plane);
  401. // clip edge to rectangle (no epsilon)
  402. Bool Clip(Edge2 &edge, C Rect &rect);
  403. Bool Clip(EdgeD2 &edge, C RectD &rect);
  404. // clip edge to box (no epsilon)
  405. Bool Clip(Edge &edge, C Box &box);
  406. Bool Clip(EdgeD &edge, C BoxD &box);
  407. Bool Clip(Edge &edge, C Extent &ext);
  408. // sweep
  409. Bool SweepPointEdge(C Vec2 &point, C Vec2 &move, C Edge2_I &ei, Flt *hit_frac=null, Vec2 *hit_normal=null, Vec2 *hit_pos=null); // if moving point cuts through a static edge
  410. Bool SweepPointEdge(C VecD2 &point, C VecD2 &move, C EdgeD2_I &ei, Dbl *hit_frac=null, VecD2 *hit_normal=null, VecD2 *hit_pos=null); // if moving point cuts through a static edge
  411. // draw
  412. void DrawArrow (C Color &color, C Vec &start, C Vec &end, Flt tip_radius=0.1f, Flt tip_length=0.1f);
  413. void DrawArrow2(C Color &color, C Vec &start, C Vec &end, Flt width=0.02f, Flt tip_radius=0.1f, Flt tip_length=0.1f);
  414. // subdivide
  415. void SubdivideEdges(C MemPtr<Vec > &src, MemPtr<Vec > dest); // subdivide continuous points from 'src' into 'dest'
  416. void SubdivideEdges(C MemPtr<VtxFull> &src, MemPtr<VtxFull> dest); // subdivide continuous points from 'src' into 'dest'
  417. /******************************************************************************/