17 #include "Base/Math/MathTools.h"
18 #include "Base/Tools/DebugMemory.h"
24 TC3DNodeList* pC3DNodeList =
new TC3DNodeList();
25 int nNodes = (int)pGraph->
getNodes()->size();
27 for (
int i = 0; i < nNodes; i++)
30 Vec3d cartesian_point;
33 CC3DNode* pC3DNode =
new CC3DNode(cartesian_point);
34 pC3DNodeList->push_back(pC3DNode);
39 CCHGiftWrap giftWrapping = CCHGiftWrap(pC3DNodeList);
41 giftWrapping.generateConvexHull(pCopy);
46 for (
int e = 0; e < pEdges->size(); e++)
48 pGraph->
addEdge(pEdges->at(e)->nIndex1, pEdges->at(e)->nIndex2);
57 int nNumberViews = (int)pGraph->
getNodes()->size();
70 for (
int e = 0; e < int(pDoubleGraph->
getEdges()->size()); e++)
72 pCurrentEdge = pDoubleGraph->
getEdges()->at(e);
73 nIndex1 = pCurrentEdge->
nIndex1;
74 nIndex2 = pCurrentEdge->
nIndex2;
99 if (nIndex1 >= nNumberViews)
101 nIndex1 %= nNumberViews;
104 if (nIndex2 >= nNumberViews)
106 nIndex2 %= nNumberViews;
110 if (nIndex1 != nIndex2)
113 pGraph->
addEdge(nIndex1, nIndex2);
125 int nNumberPoints = int(pNodes->size());
129 for (i = 0; i < nNumberPoints - 2; i++)
131 printf(
"Round %d / %d\n", i, nNumberPoints - 2);
133 for (j = i + 1; j < nNumberPoints - 1; j++)
137 for (k = j + 1; k < nNumberPoints; k++)
139 if (k != i && k != j)
145 for (l = 0; l < nNumberPoints; l++)
148 if (l != i && l != j && l != k)
153 pGraph, i, j, k, l, bInside))
170 p_i = pNodes->at(i)->getPosition();
171 p_j = pNodes->at(j)->getPosition();
172 p_k = pNodes->at(k)->getPosition();
210 int nEdgeIndex = pGraph->
addEdge(
s, t, -1, -1);
214 while (nCurrentEdge <
int(pEdges->size()))
216 if (pEdges->at(nCurrentEdge)->nLeftFace == -1)
218 completeFacet(pGraph, nCurrentEdge, nFaces);
221 if (pEdges->at(nCurrentEdge)->nRightFace == -1)
223 completeFacet(pGraph, nCurrentEdge, nFaces);
231 GraphTriangulation::completeFacet(
CSphericalGraph* pGraph,
int nEdgeIndex,
int nFaces)
238 if (pEdges->at(nEdgeIndex)->nLeftFace == -1)
240 s = pEdges->at(nEdgeIndex)->nIndex1;
241 t = pEdges->at(nEdgeIndex)->nIndex2;
243 else if (pEdges->at(nEdgeIndex)->nRightFace == -1)
245 s = pEdges->at(nEdgeIndex)->nIndex2;
246 t = pEdges->at(nEdgeIndex)->nIndex1;
256 for (u = 0; u < int(pNodes->size()); u++)
258 if (u ==
s || u == t)
265 pNodes->at(t)->getPosition(),
266 pNodes->at(u)->getPosition());
278 if (nBestPoint <
int(pNodes->size()))
284 for (u = nBestPoint + 1; u < int(pNodes->size()); u++)
286 if (u ==
s || u == t)
292 pNodes->at(t)->getPosition(),
293 pNodes->at(u)->getPosition());
311 if (nBestPoint <
int(pNodes->size()))
314 updateLeftFace(pGraph, nEdgeIndex,
s, t, nFaces);
320 if (nEdgeIndex == -1)
323 nEdgeIndex = pGraph->
addEdge(nBestPoint,
s, nFaces, -1);
328 updateLeftFace(pGraph, nEdgeIndex, nBestPoint,
s, nFaces);
334 if (nEdgeIndex == -1)
337 nEdgeIndex = pGraph->
addEdge(t, nBestPoint, nFaces, -1);
342 updateLeftFace(pGraph, nEdgeIndex, t, nBestPoint, nFaces);
347 updateLeftFace(pGraph, nEdgeIndex,
s, t, -2);
359 vector<CSGEdge*>* pEdges = pGraph->
getEdges();
363 if ((pEdges->at(nEdgeIndex)->nIndex1 == nIndex1) &&
364 (pEdges->at(nEdgeIndex)->nIndex2 == nIndex2))
369 if ((pEdges->at(nEdgeIndex)->nIndex1 == nIndex2) &&
370 (pEdges->at(nEdgeIndex)->nIndex2 == nIndex1))
377 printf(
"updateLeftFace: adj. matrix and edge table mismatch\n");
380 if ((pEdges->at(nEdgeIndex)->nIndex1 == nIndex1) && (pEdges->at(nEdgeIndex)->nLeftFace == -1))
382 pEdges->at(nEdgeIndex)->nLeftFace = nFace;
384 else if ((pEdges->at(nEdgeIndex)->nIndex2 == nIndex1) &&
385 (pEdges->at(nEdgeIndex)->nRightFace == -1))
387 pEdges->at(nEdgeIndex)->nRightFace = nFace;
396 int nNumberSourceNodes = (int)pNodes->size();
399 vector<TSphereCoord> coordinates;
402 for (
int i = 0; i < nNumberSourceNodes; i++)
404 coordinates.push_back(pNodes->at(i)->getPosition());
409 for (
int i = 0; i < nNumberSourceNodes; i++)
411 shiftedCoord = pNodes->at(i)->getPosition();
412 shiftedCoord.
fTheta += 360.0f;
413 coordinates.push_back(shiftedCoord);
434 for (
int i = 0; i < 2 * nNumberSourceNodes; i++)