// Output list of points void Convex::OutputPointList (PointList *Ps) { Point P; while (!Ps->IsEmpty()) { Ps->Remove(&P); P.OutputPoint(); printf("\n"); } };
// добавка точки до опуклої оболонки void Convex::AddPointToHull(FacetList* Polyhedron, PointList *listUnclaimedVertices) { Facet *pF, *pF2; Point P; Point DistP, DistCur; int re; Segment S; SegmentList Horizont; Polyhedron->GetFirst(&pF); do { if ( pF->listVertices.GetFirst(&DistP)) { FacetList VisibleFaces; // Знаходимо найбiльш вiддалену точку DistP вiд гранi pF DistCur = DistP; do { if ((pF->DistanceToPoint(DistP))<(pF->DistanceToPoint(DistCur))) DistP.Init(DistCur); } while (pF->listVertices.GetNext(&DistCur)); #ifdef CONVEX_DEBUG printf( "Search the furthest point to facet "); pF->PrintCoordinates(0); printf( ". DisP= "); DistP.OutputPoint(); printf( "\n"); #endif // Проходимось по всiх гранях i видимi з точки DistP додаємо до списку VisibleFaces, do { Polyhedron->GetFirst(&pF); re = 0; do { if (pF->IsOnFacet(DistP)>eps) { Facet *pF2 = new Facet; *pF2 = (*pF); #ifdef CONVEX_DEBUG pF->PrintCoordinates(0); printf( " added to list of visibles from DisP\n"); #endif VisibleFaces.Add(pF2); Polyhedron->FindAndRemoveAll( pF ); re = 1; }; } while ( Polyhedron->GetNext(&pF) && !re ); } while (re); // обходимо всi видимi гранi i всi зовнiшнi точки з них вiдносимо до списку невикористаних if ( VisibleFaces.GetFirst(&pF) ) { do { while ( pF->listVertices.Remove(&P)) { listUnclaimedVertices->Add( P ); P.OutputPoint(); printf( " added to list of Unclaimed points\n"); }; } while ( VisibleFaces.GetNext(&pF) ); }; // з списку невикористаних прибираємо знайдену точку DistP listUnclaimedVertices->FindAndRemoveAll( DistP ); // добавляємо в список граней новi, бічні грані конуса побудованого вiд знайденої точки до її горизонту FacetToSegmentsGorizon(&VisibleFaces, &Horizont); Horizont.GetFirst(&S); do { pF2 = new Facet; pF2->CreateOrientatedFace( S.A, S.B, DistP, insidePoint ); Polyhedron->Add( pF2 ); } while ( Horizont.GetNext(&S) ); return; // одна точка (DistP) в оболонку добавлена }; } while ( Polyhedron->GetNext(&pF) ); };