TorusGenerator.cpp

00001 #include "TorusGenerator.h"
00002 
00003 GraphicalObject * TorusGenerator::CreateTorus (RawObject * raw_object, double r_t, double r_p, int rings, int slices)
00004 {
00005         return CreateRings (raw_object, r_t, r_p, 0.0, 2 * MY_PI, rings, slices);
00006 }
00007 
00008 GraphicalObject * TorusGenerator::CreateRings (RawObject * raw_object, double r_t, double r_p, double min_t, double max_t, int rings, int slices)
00009 {
00010         if (rings == 1)
00011         {
00012                 return CreateRingPart (raw_object, r_t, r_p, min_t, 0.0, 2 * MY_PI, slices);
00013         }
00014         else
00015         {
00016                 GroupObject * group = new GroupObject ();
00017                 GraphicalObject * child_1; 
00018                 GraphicalObject * child_2;
00019                 int first_group_count;
00020 
00021                 first_group_count = rings / 2;
00022                 
00023                 // split the finally generated objects into two groups
00024                 child_1 = CreateRings (raw_object, r_t, r_p, min_t, (max_t - min_t) * first_group_count / rings + min_t, first_group_count, slices);
00025                 child_2 = CreateRings (raw_object, r_t, r_p, min_t + (max_t - min_t) * first_group_count / rings, max_t, rings - first_group_count, slices);
00026                 
00027                 group->AddChild (child_1);
00028                 group->AddChild (child_2);
00029 
00030                 return  group;
00031         }
00032 }
00033 
00034 GraphicalObject * TorusGenerator::CreateRingPart (RawObject * raw_object, double r_t, double r_p, double curr_t, double min_p, double max_p, int slices)
00035 {
00036         if (slices == 1)
00037         {
00038                 TerminalObject * terminal;
00039 
00040                 terminal = new TerminalObject (raw_object);
00041 
00042                 float x, y, z;
00043 
00044                 x = (r_t + r_p * cos (min_p)) * cos (curr_t);
00045                 y = (r_t + r_p * cos (min_p)) * sin (curr_t);
00046                 z = r_p * sin (min_p);
00047 
00048                 terminal->position->SetConstantPosition (x, y, z, 0.0f, 0.0f, 0.0f);
00049 
00050                 return terminal;
00051         }
00052         else
00053         {
00054                 GroupObject * group = new GroupObject ();
00055                 GraphicalObject * child_1;
00056                 GraphicalObject * child_2;
00057                 int first_group_count;
00058 
00059                 first_group_count = slices / 2;
00060                 child_1 = CreateRingPart (raw_object, r_t, r_p, curr_t, min_p, min_p + (max_p - min_p) * first_group_count / slices, first_group_count);
00061                 child_2 = CreateRingPart (raw_object, r_t, r_p, curr_t, min_p + (max_p - min_p) * first_group_count / slices, max_p, slices - first_group_count);
00062 
00063                 group->AddChild (child_1);
00064                 group->AddChild (child_2);
00065 
00066                 return group;
00067         }
00068 }
00069 
00070 GraphicalObject * TorusGenerator::CreateTorus (DLODObject * dlod_object, double r_t, double r_p, int rings, int slices)
00071 {
00072         return CreateRings (dlod_object, r_t, r_p, 0.0, 2 * MY_PI, rings, slices);
00073 }
00074 
00075 GraphicalObject * TorusGenerator::CreateRings (DLODObject * dlod_object, double r_t, double r_p, double min_t, double max_t, int rings, int slices)
00076 {
00077         if (rings == 1)
00078         {
00079                 return CreateRingPart (dlod_object, r_t, r_p, min_t, 0.0, 2 * MY_PI, slices);
00080         }
00081         else
00082         {
00083                 GroupObject * group = new GroupObject ();
00084                 GraphicalObject * child_1; 
00085                 GraphicalObject * child_2;
00086                 int first_group_count;
00087 
00088                 first_group_count = rings / 2;
00089                 
00090                 child_1 = CreateRings (dlod_object, r_t, r_p, min_t, (max_t - min_t) * first_group_count / rings + min_t, first_group_count, slices);
00091                 child_2 = CreateRings (dlod_object, r_t, r_p, min_t + (max_t - min_t) * first_group_count / rings, max_t, rings - first_group_count, slices);
00092 
00093                 group->AddChild (child_1);
00094                 group->AddChild (child_2);
00095 
00096                 return  group;
00097         }
00098 }
00099 
00100 GraphicalObject * TorusGenerator::CreateRingPart (DLODObject * dlod_object, double r_t, double r_p, double curr_t, double min_p, double max_p, int slices)
00101 {
00102         if (slices == 1)
00103         {
00104                 DLODObject * terminal;
00105 
00106                 terminal = dlod_object->GetClone ();
00107 
00108                 float x, y, z;
00109 
00110                 x = (r_t + r_p * cos (min_p)) * cos (curr_t);
00111                 y = (r_t + r_p * cos (min_p)) * sin (curr_t);
00112                 z = r_p * sin (min_p);
00113 
00114                 terminal->position->SetConstantPosition (x, y, z, 0.0f, 0.0f, 0.0f);
00115 
00116                 return terminal;
00117         }
00118         else
00119         {
00120                 GroupObject * group = new GroupObject ();
00121                 GraphicalObject * child_1;
00122                 GraphicalObject * child_2;
00123                 int first_group_count;
00124 
00125                 first_group_count = slices / 2;
00126                 child_1 = CreateRingPart (dlod_object, r_t, r_p, curr_t, min_p, min_p + (max_p - min_p) * first_group_count / slices, first_group_count);
00127                 child_2 = CreateRingPart (dlod_object, r_t, r_p, curr_t, min_p + (max_p - min_p) * first_group_count / slices, max_p, slices - first_group_count);
00128 
00129                 group->AddChild (child_1);
00130                 group->AddChild (child_2);
00131 
00132                 return group;
00133         }
00134 }
00135 
00136 bool TorusGenerator::HasMore ()
00137 {
00138         if (ring_index >= rings)
00139         {return false;}
00140         else
00141         {return true;}
00142 }
00143 
00144 void TorusGenerator::StartTorus (double r_t, double r_p, int rings, int slices)
00145 {
00146         TorusGenerator::r_t = r_t;
00147         TorusGenerator::r_p = r_p;
00148         TorusGenerator::rings = rings;
00149         TorusGenerator::slices = slices;
00150         TorusGenerator::ring_index = 0;
00151         TorusGenerator::slice_index = 0;
00152 }
00153 
00154 double TorusGenerator::r_t = 0.0;
00155 double TorusGenerator::r_p = 0.0;
00156 int TorusGenerator::rings = 0;
00157 int TorusGenerator::slices = 0;
00158 int TorusGenerator::ring_index = 0;
00159 int TorusGenerator::slice_index = 0;
00160 
00161 Point TorusGenerator::GetNextPoint ()
00162 {
00163         Point current_point;
00164         double t, p, r_t, r_p;
00165 
00166         r_t = TorusGenerator::r_t;
00167         r_p = TorusGenerator::r_p;
00168         t = 2.0 * MY_PI * TorusGenerator::ring_index / TorusGenerator::rings;
00169         p = 2.0 * MY_PI * TorusGenerator::slice_index / TorusGenerator::slices;
00170 
00171         current_point.x = (r_t + r_p * cos (p)) * cos (t);
00172         current_point.y = (r_t + r_p * cos (p)) * sin (t);
00173         current_point.z =  r_p * sin (p);
00174 
00175         TorusGenerator::slice_index += 1;
00176         if (TorusGenerator::slice_index == TorusGenerator::slices)
00177         {
00178                 TorusGenerator::slice_index = 0;
00179                 TorusGenerator::ring_index += 1;
00180         }
00181 
00182         return current_point;
00183 }

Generated on Sun Jul 2 13:20:39 2006 for Demo by  doxygen 1.4.6-NO