Torus.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /******************************************************************************
  2. Use 'Torus' to handle torus shapes.
  3. /******************************************************************************/
  4. struct Torus // Torus Shape
  5. {
  6. Flt R , // main radius
  7. r ; // tube radius
  8. Vec pos, // center position
  9. up ; // up direction
  10. Torus& set(Flt R, Flt r, C Vec &pos=VecZero, C Vec &up=Vec(0,1,0)) {T.R=R; T.r=r; T.pos=pos; T.up=up; return T;}
  11. // transform
  12. Torus& operator+=(C Vec &v) {pos+=v; return T;}
  13. Torus& operator-=(C Vec &v) {pos-=v; return T;}
  14. Torus& operator*=( Flt f);
  15. Torus& operator/=( Flt f);
  16. Torus& operator*=(C Matrix3 &m);
  17. Torus& operator*=(C Matrix &m);
  18. friend Torus operator+ (C Torus &torus, C Vec &v) {return Torus(torus)+=v;}
  19. friend Torus operator- (C Torus &torus, C Vec &v) {return Torus(torus)-=v;}
  20. friend Torus operator* (C Torus &torus, Flt f) {return Torus(torus)*=f;}
  21. friend Torus operator/ (C Torus &torus, Flt f) {return Torus(torus)/=f;}
  22. friend Torus operator* (C Torus &torus, C Matrix3 &m) {return Torus(torus)*=m;}
  23. friend Torus operator* (C Torus &torus, C Matrix &m) {return Torus(torus)*=m;}
  24. // get
  25. Flt area ()C {return (4*PI*PI)*R*r ;} // get surface area
  26. Flt volume()C {return (2*PI*PI)*R*r*r;} // get volume
  27. Str asText()C {return S+"MainRadius: "+R+", TubeRadius: "+r+", Pos: "+pos+", Up: "+up;} // get text description
  28. // operations
  29. Torus& extend(Flt e) {r+=e; return T;} // extend
  30. // draw
  31. void draw(C Color &color=WHITE, Bool fill=false, VecI2 resolution=VecI2(-1))C; // this relies on active object matrix which can be set using 'SetMatrix' function
  32. Torus() {}
  33. Torus(Flt R, Flt r, C Vec &pos=VecZero, C Vec &up=Vec(0,1,0)) {set(R, r, pos, up);}
  34. };
  35. /******************************************************************************/
  36. // distance
  37. Flt Dist(C Vec &point, C Torus &torus); // distance between point and a torus
  38. /******************************************************************************/