Tube.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /******************************************************************************
  2. Use 'Tube' to handle tube shapes.
  3. /******************************************************************************/
  4. struct Tube // Tube Shape
  5. {
  6. Flt r , // radius
  7. h ; // height
  8. Vec pos, // center position
  9. up ; // up direction
  10. Tube& set(Flt r, Flt h, C Vec &pos=VecZero, C Vec &up=Vec(0,1,0)) {T.r=r; T.h=h; T.pos=pos; T.up=up; return T;}
  11. // get
  12. Flt area ()C {return PI2*r *(h+r) ;} // get surface area
  13. Flt volume()C {return PI *r*r* h ;} // get volume
  14. Vec pointU()C {return pos+up*(h*0.5f) ;} // upper circle center point
  15. Vec pointD()C {return pos-up*(h*0.5f) ;} // lower circle center point
  16. Edge edge ()C {return Edge(pointD(), pointU());} // get edge between lower and upper points
  17. Str asText()C {return S+"Radius: "+r+", Height: "+h+", Pos: "+pos+", Up: "+up;} // get text description
  18. // transform
  19. Tube& operator+=(C Vec &v) {pos+=v; return T;}
  20. Tube& operator-=(C Vec &v) {pos-=v; return T;}
  21. Tube& operator*=( Flt f);
  22. Tube& operator/=( Flt f);
  23. Tube& operator*=(C Vec &v);
  24. Tube& operator/=(C Vec &v);
  25. Tube& operator*=(C Matrix3 &m);
  26. Tube& operator*=(C Matrix &m);
  27. friend Tube operator+ (C Tube &tube, C Vec &v) {return Tube(tube)+=v;}
  28. friend Tube operator- (C Tube &tube, C Vec &v) {return Tube(tube)-=v;}
  29. friend Tube operator* (C Tube &tube, Flt f) {return Tube(tube)*=f;}
  30. friend Tube operator/ (C Tube &tube, Flt f) {return Tube(tube)/=f;}
  31. friend Tube operator* (C Tube &tube, C Vec &v) {return Tube(tube)*=v;}
  32. friend Tube operator/ (C Tube &tube, C Vec &v) {return Tube(tube)/=v;}
  33. friend Tube operator* (C Tube &tube, C Matrix3 &m) {return Tube(tube)*=m;}
  34. friend Tube operator* (C Tube &tube, C Matrix &m) {return Tube(tube)*=m;}
  35. // operations
  36. Tube& extend(Flt e) {r+=e; h+=e+e; return T;} // extend
  37. // draw
  38. #if EE_PRIVATE
  39. void drawVI( Bool fill=false, Int resolution=-1)C; // this relies on active object matrix which can be set using 'SetMatrix' function
  40. #endif
  41. void draw(C Color &color=WHITE, Bool fill=false, Int resolution=-1)C; // this relies on active object matrix which can be set using 'SetMatrix' function
  42. Tube() {}
  43. Tube(Flt r, Flt h, C Vec &pos=VecZero, C Vec &up=Vec(0,1,0)) {set(r, h, pos, up);}
  44. };
  45. /******************************************************************************/
  46. // cuts
  47. Bool Cuts(C Vec &point, C Tube &tube); // if point cuts tube
  48. Bool Cuts(C Edge &edge , C Tube &tube); // if edge cuts tube
  49. // sweep
  50. Bool SweepPointTube(C Vec &point, C Vec &move, C Tube &tube, Flt *hit_frac=null, Vec *hit_normal=null); // if moving point cuts through a static tube
  51. /******************************************************************************/