00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "Teddy/Maths/Vector.h"
00026 #include "Teddy/Models/QuadStrip.h"
00027 #include "Teddy/Models/Torus.h"
00028 #include "Teddy/Models/Vertex.h"
00029 #include "Teddy/SysSupport/StdMaths.h"
00030
00031
00032 namespace Teddy {
00033 namespace Models {
00034
00035
00044 Torus::Torus(
00045 const std::string &name,
00046 const double major_radius,
00047 const double minor_radius,
00048 const int stacks,
00049 const int slices
00050 ):Model( name ){
00051 int i;
00052 int j;
00053 int k;
00054 double s;
00055 double t;
00056 double x;
00057 double y;
00058 double z;
00059
00060 double cp = M_2_PI/(double)stacks;
00061 double tp = M_2_PI/(double)slices;
00062
00063 for( i=0; i<stacks; i++ ){
00064 QuadStrip *qs = new QuadStrip();
00065 for( j=0; j<=slices; j++ ){
00066 for( k=0; k<2; k++ ){
00067 s = (i + k) % stacks + 0.5;
00068 t = j % slices;
00069
00070 x = (major_radius + minor_radius * cos(s*cp)) * cos(t*tp);
00071 y = (major_radius + minor_radius * cos(s*cp)) * sin(t*tp);
00072 z = minor_radius * sin(s*cp);
00073 Vertex *v = new Vertex( x, y, z );
00074
00075 x = cos(t*tp) * cos(s*cp);
00076 y = sin(t*tp) * cos(s*cp);
00077 z = sin(s*cp);
00078 v->setNormal( Vector( x, y, z ) );
00079 qs->add( v );
00080 }
00081 }
00082 add( qs );
00083 }
00084
00085 setupClipRadius();
00086 }
00087
00088
00089 };
00090 };
00091