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
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 }