12 vector<Vec3d> CGraphGenerator::m_Vertices;
13 vector<Face> CGraphGenerator::m_Faces;
21 initBasePolyhedron(nBaseType);
22 projectToSphere(fRadius);
24 for (
int L = 0; L < nLevels; L++)
27 projectToSphere(fRadius);
30 buildNodesAndEdges(pPlainGraph);
42 generateTetrahedron();
50 generateIcosahedron();
54 printf(
"Wrong base type\n");
60 CGraphGenerator::generateTetrahedron()
63 float fSqrt3 =
sqrt(3.0);
66 Math3d::SetVec(
v[0], fSqrt3, fSqrt3, fSqrt3);
67 Math3d::SetVec(
v[1], -fSqrt3, -fSqrt3, fSqrt3);
68 Math3d::SetVec(
v[2], -fSqrt3, fSqrt3, -fSqrt3);
69 Math3d::SetVec(
v[3], fSqrt3, -fSqrt3, -fSqrt3);
71 for (
int i = 0; i < 4; i++)
73 m_Vertices.push_back(
v[i]);
83 for (
int i = 0; i < 4; i++)
88 m_Faces.push_back(f[i]);
93 CGraphGenerator::generateOctahedron()
97 Math3d::SetVec(
v[0], 1, 0, 0);
98 Math3d::SetVec(
v[1], -1, 0, 0);
99 Math3d::SetVec(
v[2], 0, 1, 0);
100 Math3d::SetVec(
v[3], 0, -1, 0);
101 Math3d::SetVec(
v[4], 0, 0, 1);
102 Math3d::SetVec(
v[5], 0, 0, -1);
104 for (
int i = 0; i < 6; i++)
106 m_Vertices.push_back(
v[i]);
120 for (
int i = 0; i < 8; i++)
125 m_Faces.push_back(f[i]);
130 CGraphGenerator::generateIcosahedron()
133 float tau = 0.8506508084;
134 float one = 0.5257311121;
138 Math3d::SetVec(
v[0], tau, one, 0);
139 Math3d::SetVec(
v[1], -tau, one, 0);
140 Math3d::SetVec(
v[2], -tau, -one, 0);
141 Math3d::SetVec(
v[3], tau, -one, 0);
142 Math3d::SetVec(
v[4], one, 0, tau);
143 Math3d::SetVec(
v[5], one, 0, -tau);
144 Math3d::SetVec(
v[6], -one, 0, -tau);
145 Math3d::SetVec(
v[7], -one, 0, tau);
146 Math3d::SetVec(
v[8], 0, tau, one);
147 Math3d::SetVec(
v[9], 0, -tau, one);
148 Math3d::SetVec(
v[10], 0, -tau, -one);
149 Math3d::SetVec(
v[11], 0, tau, -one);
151 for (
int i = 0; i < 12; i++)
153 m_Vertices.push_back(
v[i]);
169 f[10].
set(10, 4, 11);
170 f[11].
set(10, 11, 3);
180 for (
int i = 0; i < 20; i++)
185 m_Faces.push_back(f[i]);
190 CGraphGenerator::subDivide()
196 for (
int f = 0; f < int(m_Faces.size()); f++)
199 int nA = m_Faces.at(f).m_n1;
200 int nB = m_Faces.at(f).m_n2;
201 int nC = m_Faces.at(f).m_n3;
204 Vec3d a = m_Vertices.at(nA);
205 Vec3d b = m_Vertices.at(nB);
206 Vec3d c = m_Vertices.at(nC);
210 Math3d::AddVecVec(
a, b, a_m);
211 Math3d::MulVecScalar(a_m, 0.5, a_m);
212 Math3d::AddVecVec(b,
c, b_m);
213 Math3d::MulVecScalar(b_m, 0.5, b_m);
214 Math3d::AddVecVec(
c,
a, c_m);
215 Math3d::MulVecScalar(c_m, 0.5, c_m);
225 int nA_m, nB_m, nC_m;
228 nIndex = findVertex(a_m, 0.01);
232 m_Vertices.push_back(a_m);
233 nA_m = m_Vertices.size() - 1;
240 nIndex = findVertex(b_m, 0.01);
244 m_Vertices.push_back(b_m);
245 nB_m = m_Vertices.size() - 1;
252 nIndex = findVertex(c_m, 0.01);
256 m_Vertices.push_back(c_m);
257 nC_m = m_Vertices.size() - 1;
266 f[0].
set(nA, nA_m, nC_m);
267 f[1].
set(nA_m, nB, nB_m);
268 f[2].
set(nC_m, nB_m, nC);
269 f[3].
set(nA_m, nB_m, nC_m);
271 for (
int i = 0; i < 4; i++)
273 faces.push_back(f[i]);
282 CGraphGenerator::projectToSphere(
float fRadius)
288 for (
int v = 0;
v < int(m_Vertices.size());
v++)
290 float X = m_Vertices.at(
v).x;
291 float Y = m_Vertices.at(
v).y;
292 float Z = m_Vertices.at(
v).z;
297 float theta = atan2(Y, X);
298 float phi = atan2(
sqrt(X * X + Y * Y), Z);
301 x = fRadius * sin(phi) * cos(theta);
302 y = fRadius * sin(phi) * sin(theta);
303 z = fRadius * cos(phi);
305 m_Vertices.at(
v).x = x;
306 m_Vertices.at(
v).y = y;
307 m_Vertices.at(
v).z = z;
317 for (
int v = 0;
v < int(m_Vertices.size());
v++)
328 for (
int f = 0; f < int(m_Faces.size()); f++)
331 pGraph->
addEdge(m_Faces.at(f).m_n1, m_Faces.at(f).m_n2);
332 pGraph->
addEdge(m_Faces.at(f).m_n2, m_Faces.at(f).m_n3);
333 pGraph->
addEdge(m_Faces.at(f).m_n3, m_Faces.at(f).m_n1);
338 CGraphGenerator::findVertex(
Vec3d position,
float fEpsilon)
341 float fMinDistance = FLT_MAX;
344 for (
int v = 0;
v < int(m_Vertices.size());
v++)
346 fDistance = Math3d::Angle(position, m_Vertices.at(
v));
348 if (fDistance < fMinDistance)
350 fMinDistance = fDistance;
355 if (fMinDistance > fEpsilon)