Doxygen Source Code Documentation
poly.c File Reference
#include "qhull_a.h"
Go to the source code of this file.
Functions | |
void | qh_appendfacet (facetT *facet) |
void | qh_appendvertex (vertexT *vertex) |
void | qh_attachnewfacets (void) |
boolT | qh_checkflipped (facetT *facet, realT *distp, boolT allerror) |
void | qh_delfacet (facetT *facet) |
void | qh_deletevisible (void) |
setT * | qh_facetintersect (facetT *facetA, facetT *facetB, int *skipA, int *skipB, int prepend) |
unsigned | qh_gethash (int hashsize, setT *set, int size, int firstindex, void *skipelem) |
facetT * | qh_makenewfacet (setT *vertices, boolT toporient, facetT *horizon) |
void | qh_makenewplanes (void) |
facetT * | qh_makenew_nonsimplicial (facetT *visible, vertexT *apex, int *numnew) |
facetT * | qh_makenew_simplicial (facetT *visible, vertexT *apex, int *numnew) |
void | qh_matchneighbor (facetT *newfacet, int newskip, int hashsize, int *hashcount) |
void | qh_matchnewfacets (void) |
boolT | qh_matchvertices (int firstindex, setT *verticesA, int skipA, setT *verticesB, int *skipB, boolT *same) |
facetT * | qh_newfacet (void) |
ridgeT * | qh_newridge (void) |
int | qh_pointid (pointT *point) |
void | qh_removefacet (facetT *facet) |
void | qh_removevertex (vertexT *vertex) |
void | qh_updatevertices (void) |
Function Documentation
|
Definition at line 33 of file poly.c. References facetT::id, facetT::next, facetT::previous, qh, and trace4. Referenced by qh_checkconnect(), qh_createsimplex(), qh_findgooddist(), qh_findhorizon(), qh_makenewfacet(), qh_mergecycle_facets(), qh_mergefacet(), and qh_partitionpoint().
00033 { 00034 facetT *tail= qh facet_tail; 00035 00036 if (tail == qh newfacet_list) 00037 qh newfacet_list= facet; 00038 if (tail == qh facet_next) 00039 qh facet_next= facet; 00040 facet->previous= tail->previous; 00041 facet->next= tail; 00042 if (tail->previous) 00043 tail->previous->next= facet; 00044 else 00045 qh facet_list= facet; 00046 tail->previous= facet; 00047 qh num_facets++; 00048 trace4((qh ferr, "qh_appendfacet: append f%d to facet_list\n", facet->id)); 00049 } /* appendfacet */ |
|
Definition at line 67 of file poly.c. References vertexT::id, vertexT::newlist, vertexT::next, vertexT::previous, qh, and trace4. Referenced by qh_createsimplex(), qh_makenewfacet(), qh_makenewfacets(), qh_mergesimplex(), and qh_newvertices().
00067 { 00068 vertexT *tail= qh vertex_tail; 00069 00070 if (tail == qh newvertex_list) 00071 qh newvertex_list= vertex; 00072 vertex->newlist= True; 00073 vertex->previous= tail->previous; 00074 vertex->next= tail; 00075 if (tail->previous) 00076 tail->previous->next= vertex; 00077 else 00078 qh vertex_list= vertex; 00079 tail->previous= vertex; 00080 qh num_vertices++; 00081 trace4((qh ferr, "qh_appendvertex: append v%d to vertex_list\n", vertex->id)); 00082 } /* appendvertex */ |
|
Definition at line 124 of file poly.c. References ridgeT::bottom, facetT::f, FORALLnew_facets, FORALLvisible_facets, FOREACHneighbor_, FOREACHridge_, facetT::id, facetT::neighbors, otherfacet_, qh, qh_errexit2(), qh_ERRqhull, qh_memfree(), qh_setappend(), qh_setdel(), qh_setdelnth(), qh_setequal_skip(), qh_setfree(), qh_setreplace(), facetT::ridges, SETfirst_, SETfirstt_, SETindex_, facetT::simplicial, ridgeT::top, trace1, trace3, ridgeT::vertices, facetT::vertices, facetT::visible, facetT::visitid, zinc_, and Zinsidevisible. Referenced by qh_addpoint().
00124 { 00125 facetT *newfacet= NULL, *neighbor, **neighborp, *horizon, *visible; 00126 ridgeT *ridge, **ridgep; 00127 00128 qh NEWfacets= True; 00129 trace3((qh ferr, "qh_attachnewfacets: delete interior ridges\n")); 00130 qh visit_id++; 00131 FORALLvisible_facets { 00132 visible->visitid= qh visit_id; 00133 if (visible->ridges) { 00134 FOREACHridge_(visible->ridges) { 00135 neighbor= otherfacet_(ridge, visible); 00136 if (neighbor->visitid == qh visit_id 00137 || (!neighbor->visible && neighbor->simplicial)) { 00138 if (!neighbor->visible) /* delete ridge for simplicial horizon */ 00139 qh_setdel (neighbor->ridges, ridge); 00140 qh_setfree (&(ridge->vertices)); /* delete on 2nd visit */ 00141 qh_memfree (ridge, sizeof(ridgeT)); 00142 } 00143 } 00144 SETfirst_(visible->ridges)= NULL; 00145 } 00146 SETfirst_(visible->neighbors)= NULL; 00147 } 00148 trace1((qh ferr, "qh_attachnewfacets: attach horizon facets to new facets\n")); 00149 FORALLnew_facets { 00150 horizon= SETfirstt_(newfacet->neighbors, facetT); 00151 if (horizon->simplicial) { 00152 visible= NULL; 00153 FOREACHneighbor_(horizon) { /* may have more than one horizon ridge */ 00154 if (neighbor->visible) { 00155 if (visible) { 00156 if (qh_setequal_skip (newfacet->vertices, 0, horizon->vertices, 00157 SETindex_(horizon->neighbors, neighbor))) { 00158 visible= neighbor; 00159 break; 00160 } 00161 }else 00162 visible= neighbor; 00163 } 00164 } 00165 if (visible) { 00166 visible->f.replace= newfacet; 00167 qh_setreplace (horizon->neighbors, visible, newfacet); 00168 }else { 00169 fprintf (qh ferr, "qhull internal error (qh_attachnewfacets): couldn't find visible facet for horizon f%d of newfacet f%d\n", 00170 horizon->id, newfacet->id); 00171 qh_errexit2 (qh_ERRqhull, horizon, newfacet); 00172 } 00173 }else { /* non-simplicial, with a ridge for newfacet */ 00174 FOREACHneighbor_(horizon) { /* may hold for many new facets */ 00175 if (neighbor->visible) { 00176 neighbor->f.replace= newfacet; 00177 qh_setdelnth (horizon->neighbors, 00178 SETindex_(horizon->neighbors, neighbor)); 00179 neighborp--; /* repeat */ 00180 } 00181 } 00182 qh_setappend (&horizon->neighbors, newfacet); 00183 ridge= SETfirstt_(newfacet->ridges, ridgeT); 00184 if (ridge->top == horizon) 00185 ridge->bottom= newfacet; 00186 else 00187 ridge->top= newfacet; 00188 } 00189 } /* newfacets */ 00190 if (qh PRINTstatistics) { 00191 FORALLvisible_facets { 00192 if (!visible->f.replace) 00193 zinc_(Zinsidevisible); 00194 } 00195 } 00196 } /* attachnewfacets */ |
|
Definition at line 213 of file poly.c. References boolT, facetT::flipped, facetT::id, qh, qh_distplane(), qh_precision(), realT, trace0, Zdistcheck, Zflippedfacets, and zzinc_. Referenced by qh_checkflipped_all(), qh_initialhull(), and qh_matchnewfacets().
00213 { 00214 realT dist; 00215 00216 if (facet->flipped && !distp) 00217 return False; 00218 zzinc_(Zdistcheck); 00219 qh_distplane(qh interior_point, facet, &dist); 00220 if (distp) 00221 *distp= dist; 00222 if ((allerror && dist > -qh DISTround)|| (!allerror && dist >= 0.0)) { 00223 facet->flipped= True; 00224 zzinc_(Zflippedfacets); 00225 trace0((qh ferr, "qh_checkflipped: facet f%d is flipped, distance= %6.12g during p%d\n", 00226 facet->id, dist, qh furthest_id)); 00227 qh_precision ("flipped facet"); 00228 return False; 00229 } 00230 return True; 00231 } /* checkflipped */ |
|
Definition at line 285 of file poly.c. References FOREACHvertex_, facetT::next, qh, qh_delfacet(), qh_delvertex(), qh_errexit(), qh_ERRqhull, qh_setsize(), qh_settruncate(), trace1, facetT::visible, zadd_, Zdelvertexmax, Zdelvertextot, zmax_, Zvisfacetmax, and Zvisfacettot. Referenced by qh_addpoint(), and qh_qhull().
00285 { 00286 facetT *visible, *nextfacet; 00287 vertexT *vertex, **vertexp; 00288 int numvisible= 0, numdel= qh_setsize(qh del_vertices); 00289 00290 trace1((qh ferr, "qh_deletevisible: delete %d visible facets and %d vertices\n", 00291 qh num_visible, numdel)); 00292 for (visible= qh visible_list; visible && visible->visible; 00293 visible= nextfacet) { /* deleting current */ 00294 nextfacet= visible->next; 00295 numvisible++; 00296 qh_delfacet(visible); 00297 } 00298 if (numvisible != qh num_visible) { 00299 fprintf (qh ferr, "qhull internal error (qh_deletevisible): qh num_visible %d is not number of visible facets %d\n", 00300 qh num_visible, numvisible); 00301 qh_errexit (qh_ERRqhull, NULL, NULL); 00302 } 00303 qh num_visible= 0; 00304 zadd_(Zvisfacettot, numvisible); 00305 zmax_(Zvisfacetmax, numvisible); 00306 zadd_(Zdelvertextot, numdel); 00307 zmax_(Zdelvertexmax, numdel); 00308 FOREACHvertex_(qh del_vertices) 00309 qh_delvertex (vertex); 00310 qh_settruncate (qh del_vertices, 0); 00311 } /* deletevisible */ |
|
Definition at line 242 of file poly.c. References facetT::center, facetT::coplanarset, facetT::id, facetT::neighbors, facetT::normal, facetT::outsideset, qh, qh_ASvoronoi, qh_memfree_, qh_removefacet(), qh_setfree(), facetT::ridges, trace5, and facetT::vertices. Referenced by qh_addpoint(), qh_deletevisible(), and qh_freebuild().
00242 { 00243 void **freelistp; /* used !qh_NOmem */ 00244 00245 trace5((qh ferr, "qh_delfacet: delete f%d\n", facet->id)); 00246 if (facet == qh tracefacet) 00247 qh tracefacet= NULL; 00248 if (facet == qh GOODclosest) 00249 qh GOODclosest= NULL; 00250 qh_removefacet(facet); 00251 qh_memfree_(facet->normal, qh normal_size, freelistp); 00252 if (qh CENTERtype == qh_ASvoronoi) { /* uses macro calls */ 00253 qh_memfree_(facet->center, qh center_size, freelistp); 00254 }else /* AScentrum */ { 00255 qh_memfree_(facet->center, qh normal_size, freelistp); 00256 } 00257 qh_setfree(&(facet->neighbors)); 00258 if (facet->ridges) 00259 qh_setfree(&(facet->ridges)); 00260 qh_setfree(&(facet->vertices)); 00261 if (facet->outsideset) 00262 qh_setfree(&(facet->outsideset)); 00263 if (facet->coplanarset) 00264 qh_setfree(&(facet->coplanarset)); 00265 qh_memfree_(facet, sizeof(facetT), freelistp); 00266 } /* delfacet */ |
|
Definition at line 336 of file poly.c. References i, facetT::id, facetT::neighbors, qh, qh_errexit2(), qh_ERRqhull, qh_setnew_delnthsorted(), SETaddr_, trace4, and facetT::vertices. Referenced by qh_makenew_simplicial().
00337 { 00338 setT *intersect; 00339 int dim= qh hull_dim, i, j; 00340 facetT **neighborsA, **neighborsB; 00341 00342 neighborsA= SETaddr_(facetA->neighbors, facetT); 00343 neighborsB= SETaddr_(facetB->neighbors, facetT); 00344 i= j= 0; 00345 if (facetB == *neighborsA++) 00346 *skipA= 0; 00347 else if (facetB == *neighborsA++) 00348 *skipA= 1; 00349 else if (facetB == *neighborsA++) 00350 *skipA= 2; 00351 else { 00352 for (i= 3; i < dim; i++) { 00353 if (facetB == *neighborsA++) { 00354 *skipA= i; 00355 break; 00356 } 00357 } 00358 } 00359 if (facetA == *neighborsB++) 00360 *skipB= 0; 00361 else if (facetA == *neighborsB++) 00362 *skipB= 1; 00363 else if (facetA == *neighborsB++) 00364 *skipB= 2; 00365 else { 00366 for (j= 3; j < dim; j++) { 00367 if (facetA == *neighborsB++) { 00368 *skipB= j; 00369 break; 00370 } 00371 } 00372 } 00373 if (i >= dim || j >= dim) { 00374 fprintf (qh ferr, "qhull internal error (qh_facetintersect): f%d or f%d not in others neighbors\n", 00375 facetA->id, facetB->id); 00376 qh_errexit2 (qh_ERRqhull, facetA, facetB); 00377 } 00378 intersect= qh_setnew_delnthsorted (facetA->vertices, qh hull_dim, *skipA, prepend); 00379 trace4((qh ferr, "qh_facetintersect: f%d skip %d matches f%d skip %d\n", 00380 facetA->id, *skipA, facetB->id, *skipB)); 00381 return(intersect); 00382 } /* facetintersect */ |
|
Definition at line 397 of file poly.c. References i, ptr_intT, and SETelemaddr_. Referenced by qh_hashridge(), qh_hashridge_find(), qh_matchduplicates(), and qh_matchneighbor().
00397 { 00398 void **elemp= SETelemaddr_(set, firstindex, void); 00399 ptr_intT hash = 0, elem; 00400 int i; 00401 00402 switch (size-firstindex) { 00403 case 1: 00404 hash= (ptr_intT)(*elemp) - (ptr_intT) skipelem; 00405 break; 00406 case 2: 00407 hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] - (ptr_intT) skipelem; 00408 break; 00409 case 3: 00410 hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] 00411 - (ptr_intT) skipelem; 00412 break; 00413 case 4: 00414 hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] 00415 + (ptr_intT)elemp[3] - (ptr_intT) skipelem; 00416 break; 00417 case 5: 00418 hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] 00419 + (ptr_intT)elemp[3] + (ptr_intT)elemp[4] - (ptr_intT) skipelem; 00420 break; 00421 case 6: 00422 hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] 00423 + (ptr_intT)elemp[3] + (ptr_intT)elemp[4]+ (ptr_intT)elemp[5] 00424 - (ptr_intT) skipelem; 00425 break; 00426 default: 00427 hash= 0; 00428 i= 3; 00429 do { /* this is about 10% in 10-d */ 00430 if ((elem= (ptr_intT)*elemp++) != (ptr_intT)skipelem) { 00431 hash ^= (elem << i) + (elem >> (32-i)); 00432 i += 3; 00433 if (i >= 32) 00434 i -= 32; 00435 } 00436 }while(*elemp); 00437 break; 00438 } 00439 hash %= (ptr_intT) hashsize; 00440 /* hash= 0; for debugging purposes */ 00441 return hash; 00442 } /* gethash */ |
|
Definition at line 539 of file poly.c. References boolT, ridgeT::bottom, facetT::coplanar, facetT::f, FOREACHridge_, ridgeT::id, facetT::id, vertexT::id, facetT::mergehorizon, facetT::neighbors, otherfacet_, qh, qh_errexit2(), qh_ERRqhull, qh_makenewfacet(), qh_memfree(), qh_memfree_, qh_setappend(), qh_setappend_set(), qh_setdel(), qh_setfree(), qh_setnew(), qh_setreplace(), facetT::ridges, facetT::seen, SETfirst_, facetT::simplicial, ridgeT::top, trace4, ridgeT::vertices, facetT::visible, and facetT::visitid. Referenced by qh_makenewfacets().
00539 { 00540 void **freelistp; /* used !qh_NOmem */ 00541 ridgeT *ridge, **ridgep; 00542 facetT *neighbor, *newfacet= NULL, *samecycle; 00543 setT *vertices; 00544 boolT toporient; 00545 int ridgeid; 00546 00547 FOREACHridge_(visible->ridges) { 00548 ridgeid= ridge->id; 00549 neighbor= otherfacet_(ridge, visible); 00550 if (neighbor->visible) { 00551 if (!qh ONLYgood) { 00552 if (neighbor->visitid == qh visit_id) { 00553 qh_setfree (&(ridge->vertices)); /* delete on 2nd visit */ 00554 qh_memfree_(ridge, sizeof(ridgeT), freelistp); 00555 } 00556 } 00557 }else { /* neighbor is an horizon facet */ 00558 toporient= (ridge->top == visible); 00559 vertices= qh_setnew (qh hull_dim); /* makes sure this is quick */ 00560 qh_setappend (&vertices, apex); 00561 qh_setappend_set (&vertices, ridge->vertices); 00562 newfacet= qh_makenewfacet(vertices, toporient, neighbor); 00563 (*numnew)++; 00564 if (neighbor->coplanar) { 00565 newfacet->mergehorizon= True; 00566 if (!neighbor->seen) { 00567 newfacet->f.samecycle= newfacet; 00568 neighbor->f.newcycle= newfacet; 00569 }else { 00570 samecycle= neighbor->f.newcycle; 00571 newfacet->f.samecycle= samecycle->f.samecycle; 00572 samecycle->f.samecycle= newfacet; 00573 } 00574 } 00575 if (qh ONLYgood) { 00576 if (!neighbor->simplicial) 00577 qh_setappend(&(newfacet->ridges), ridge); 00578 }else { /* qh_attachnewfacets */ 00579 if (neighbor->seen) { 00580 if (neighbor->simplicial) { 00581 fprintf (qh ferr, "qhull internal error (qh_makenew_nonsimplicial): simplicial f%d sharing two ridges with f%d\n", 00582 neighbor->id, visible->id); 00583 qh_errexit2 (qh_ERRqhull, neighbor, visible); 00584 } 00585 qh_setappend (&(neighbor->neighbors), newfacet); 00586 }else 00587 qh_setreplace (neighbor->neighbors, visible, newfacet); 00588 if (neighbor->simplicial) { 00589 qh_setdel (neighbor->ridges, ridge); 00590 qh_setfree (&(ridge->vertices)); 00591 qh_memfree (ridge, sizeof(ridgeT)); 00592 }else { 00593 qh_setappend(&(newfacet->ridges), ridge); 00594 if (toporient) 00595 ridge->top= newfacet; 00596 else 00597 ridge->bottom= newfacet; 00598 } 00599 trace4((qh ferr, "qh_makenew_nonsimplicial: created facet f%d from v%d and r%d of horizon f%d\n", 00600 newfacet->id, apex->id, ridgeid, neighbor->id)); 00601 } 00602 } 00603 neighbor->seen= True; 00604 } /* for each ridge */ 00605 if (!qh ONLYgood) 00606 SETfirst_(visible->ridges)= NULL; 00607 return newfacet; 00608 } /* makenew_nonsimplicial */ |
|
Definition at line 636 of file poly.c. References boolT, facetT::coplanar, facetT::f, flip(), FOREACHneighbor_, facetT::id, vertexT::id, facetT::mergehorizon, facetT::neighbors, qh, qh_facetintersect(), qh_makenewfacet(), facetT::seen, SETelem_, SETfirst_, facetT::toporient, trace4, and facetT::visible. Referenced by qh_makenewfacets().
00636 { 00637 facetT *neighbor, **neighborp, *newfacet= NULL; 00638 setT *vertices; 00639 boolT flip, toporient; 00640 int horizonskip, visibleskip; 00641 00642 FOREACHneighbor_(visible) { 00643 if (!neighbor->seen && !neighbor->visible) { 00644 vertices= qh_facetintersect(neighbor,visible, &horizonskip, &visibleskip, 1); 00645 SETfirst_(vertices)= apex; 00646 flip= ((horizonskip & 0x1) ^ (visibleskip & 0x1)); 00647 if (neighbor->toporient) 00648 toporient= horizonskip & 0x1; 00649 else 00650 toporient= (horizonskip & 0x1) ^ 0x1; 00651 newfacet= qh_makenewfacet(vertices, toporient, neighbor); 00652 (*numnew)++; 00653 if (neighbor->coplanar && (qh PREmerge || qh MERGEexact)) { 00654 #ifndef qh_NOmerge 00655 newfacet->f.samecycle= newfacet; 00656 newfacet->mergehorizon= True; 00657 #endif 00658 } 00659 if (!qh ONLYgood) 00660 SETelem_(neighbor->neighbors, horizonskip)= newfacet; 00661 trace4((qh ferr, "qh_makenew_simplicial: create facet f%d top %d from v%d and horizon f%d skip %d top %d and visible f%d skip %d, flip? %d\n", 00662 newfacet->id, toporient, apex->id, neighbor->id, horizonskip, 00663 neighbor->toporient, visible->id, visibleskip, flip)); 00664 } 00665 } 00666 return newfacet; 00667 } /* makenew_simplicial */ |
|
Definition at line 457 of file poly.c. References boolT, FOREACHvertex_, facetT::neighbors, vertexT::newlist, qh_appendfacet(), qh_appendvertex(), qh_newfacet(), qh_removevertex(), qh_setappend(), facetT::toporient, and facetT::vertices. Referenced by qh_makenew_nonsimplicial(), and qh_makenew_simplicial().
00457 { 00458 facetT *newfacet; 00459 vertexT *vertex, **vertexp; 00460 00461 FOREACHvertex_(vertices) { 00462 if (!vertex->newlist) { 00463 qh_removevertex (vertex); 00464 qh_appendvertex (vertex); 00465 } 00466 } 00467 newfacet= qh_newfacet(); 00468 newfacet->vertices= vertices; 00469 newfacet->toporient= toporient; 00470 qh_setappend(&(newfacet->neighbors), horizon); 00471 qh_appendfacet(newfacet); 00472 return(newfacet); 00473 } /* makenewfacet */ |
|
Definition at line 490 of file poly.c. References FORALLnew_facets, facetT::mergehorizon, minimize_, qh, qh_setfacetplane(), REALmax, Wnewvertexmax, and wwval_. Referenced by qh_addpoint().
00490 { 00491 facetT *newfacet; 00492 00493 FORALLnew_facets { 00494 if (!newfacet->mergehorizon) 00495 qh_setfacetplane (newfacet); 00496 } 00497 if (qh JOGGLEmax < REALmax/2) 00498 minimize_(qh min_vertex, -wwval_(Wnewvertexmax)); 00499 } /* makenewplanes */ |
|
Definition at line 700 of file poly.c. References boolT, facetT::dupridge, getid_, facetT::id, facetT::neighbors, facetT::normal, qh, qh_addhash(), qh_DUPLICATEridge, qh_errexit2(), qh_ERRprec, qh_gethash(), qh_matchvertices(), qh_precision(), qh_setfacetplane(), qh_setindex(), SETelem_, SETelemt_, skip, facetT::toporient, trace4, facetT::vertices, Zhashlookup, Zhashtests, and zinc_. Referenced by qh_matchnewfacets().
00700 { 00701 boolT newfound= False; /* True, if new facet is already in hash chain */ 00702 boolT same, ismatch; 00703 int hash, scan; 00704 facetT *facet, *matchfacet; 00705 int skip, matchskip; 00706 00707 hash= (int)qh_gethash (hashsize, newfacet->vertices, qh hull_dim, 1, 00708 SETelem_(newfacet->vertices, newskip)); 00709 trace4((qh ferr, "qh_matchneighbor: newfacet f%d skip %d hash %d hashcount %d\n", 00710 newfacet->id, newskip, hash, *hashcount)); 00711 zinc_(Zhashlookup); 00712 for (scan= hash; (facet= SETelemt_(qh hash_table, scan, facetT)); 00713 scan= (++scan >= hashsize ? 0 : scan)) { 00714 if (facet == newfacet) { 00715 newfound= True; 00716 continue; 00717 } 00718 zinc_(Zhashtests); 00719 if (qh_matchvertices (1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) { 00720 if (SETelem_(newfacet->vertices, newskip) == 00721 SETelem_(facet->vertices, skip)) { 00722 qh_precision ("two facets with the same vertices"); 00723 fprintf (qh ferr, "qhull precision error: Vertex sets are the same for f%d and f%d. Can not force output.\n", 00724 facet->id, newfacet->id); 00725 qh_errexit2 (qh_ERRprec, facet, newfacet); 00726 } 00727 ismatch= (same == (newfacet->toporient ^ facet->toporient)); 00728 matchfacet= SETelemt_(facet->neighbors, skip, facetT); 00729 if (ismatch && !matchfacet) { 00730 SETelem_(facet->neighbors, skip)= newfacet; 00731 SETelem_(newfacet->neighbors, newskip)= facet; 00732 (*hashcount)--; 00733 trace4((qh ferr, "qh_matchneighbor: f%d skip %d matched with new f%d skip %d\n", 00734 facet->id, skip, newfacet->id, newskip)); 00735 return; 00736 } 00737 if (!qh PREmerge && !qh MERGEexact) { 00738 qh_precision ("a ridge with more than two neighbors"); 00739 fprintf (qh ferr, "qhull precision error: facets f%d, f%d and f%d meet at a ridge with more than 2 neighbors. Can not continue.\n", 00740 facet->id, newfacet->id, getid_(matchfacet)); 00741 qh_errexit2 (qh_ERRprec, facet, newfacet); 00742 } 00743 SETelem_(newfacet->neighbors, newskip)= qh_DUPLICATEridge; 00744 newfacet->dupridge= True; 00745 if (!newfacet->normal) 00746 qh_setfacetplane (newfacet); 00747 qh_addhash (newfacet, qh hash_table, hashsize, hash); 00748 (*hashcount)++; 00749 if (!facet->normal) 00750 qh_setfacetplane (facet); 00751 if (matchfacet != qh_DUPLICATEridge) { 00752 SETelem_(facet->neighbors, skip)= qh_DUPLICATEridge; 00753 facet->dupridge= True; 00754 if (!facet->normal) 00755 qh_setfacetplane (facet); 00756 if (matchfacet) { 00757 matchskip= qh_setindex (matchfacet->neighbors, facet); 00758 SETelem_(matchfacet->neighbors, matchskip)= qh_DUPLICATEridge; 00759 matchfacet->dupridge= True; 00760 if (!matchfacet->normal) 00761 qh_setfacetplane (matchfacet); 00762 qh_addhash (matchfacet, qh hash_table, hashsize, hash); 00763 *hashcount += 2; 00764 } 00765 } 00766 trace4((qh ferr, "qh_matchneighbor: new f%d skip %d duplicates ridge for f%d skip %d matching f%d ismatch %d at hash %d\n", 00767 newfacet->id, newskip, facet->id, skip, 00768 (matchfacet == qh_DUPLICATEridge ? -2 : getid_(matchfacet)), 00769 ismatch, hash)); 00770 return; /* end of duplicate ridge */ 00771 } 00772 } 00773 if (!newfound) 00774 SETelem_(qh hash_table, scan)= newfacet; /* same as qh_addhash */ 00775 (*hashcount)++; 00776 trace4((qh ferr, "qh_matchneighbor: no match for f%d skip %d at hash %d\n", 00777 newfacet->id, newskip, hash)); 00778 } /* matchneighbor */ |
|
Definition at line 812 of file poly.c. References facetT::dupridge, setT::e, FORALLfacet_, FORALLnew_facets, FOREACHfacet_i_, FOREACHneighbor_i_, facetT::id, setT::maxsize, facetT::neighbors, facetT::normal, qh, qh_ALL, qh_checkflipped(), qh_checkflipped_all(), qh_DUPLICATEridge, qh_errexit(), qh_ERRqhull, qh_matchduplicates(), qh_matchneighbor(), qh_newhashtable(), qh_printfacetlist(), qh_printhashtable(), qh_setfree(), qh_setsize(), SETelemaddr_, SETelemsize, SETelemt_, and trace1. Referenced by qh_addpoint().
00812 { 00813 int numnew=0, hashcount=0, newskip; 00814 facetT *newfacet, *neighbor; 00815 int dim= qh hull_dim, hashsize, neighbor_i, neighbor_n; 00816 setT *neighbors; 00817 #ifndef qh_NOtrace 00818 int facet_i, facet_n, numfree= 0; 00819 facetT *facet; 00820 #endif 00821 00822 trace1((qh ferr, "qh_matchnewfacets: match neighbors for new facets.\n")); 00823 FORALLnew_facets { 00824 numnew++; 00825 { /* inline qh_setzero (newfacet->neighbors, 1, qh hull_dim); */ 00826 neighbors= newfacet->neighbors; 00827 neighbors->e[neighbors->maxsize].i= dim+1; /*may be overwritten*/ 00828 memset ((char *)SETelemaddr_(neighbors, 1, void), 0, dim * SETelemsize); 00829 } 00830 } 00831 qh_newhashtable (numnew*(qh hull_dim-1)); /* twice what is normally needed, 00832 but every ridge could be DUPLICATEridge */ 00833 hashsize= qh_setsize (qh hash_table); 00834 FORALLnew_facets { 00835 for (newskip=1; newskip<qh hull_dim; newskip++) /* furthest/horizon already matched */ 00836 qh_matchneighbor (newfacet, newskip, hashsize, &hashcount); 00837 #if 0 /* use the following to trap hashcount errors */ 00838 { 00839 int count= 0, k; 00840 facetT *facet, *neighbor; 00841 00842 count= 0; 00843 FORALLfacet_(qh newfacet_list) { /* newfacet already in use */ 00844 for (k=1; k < qh hull_dim; k++) { 00845 neighbor= SETelemt_(facet->neighbors, k, facetT); 00846 if (!neighbor || neighbor == qh_DUPLICATEridge) 00847 count++; 00848 } 00849 if (facet == newfacet) 00850 break; 00851 } 00852 if (count != hashcount) { 00853 fprintf (qh ferr, "qh_matchnewfacets: after adding facet %d, hashcount %d != count %d\n", 00854 newfacet->id, hashcount, count); 00855 qh_errexit (qh_ERRqhull, newfacet, NULL); 00856 } 00857 } 00858 #endif /* end of trap code */ 00859 } 00860 if (hashcount) { 00861 FORALLnew_facets { 00862 if (newfacet->dupridge) { 00863 FOREACHneighbor_i_(newfacet) { 00864 if (neighbor == qh_DUPLICATEridge) { 00865 qh_matchduplicates (newfacet, neighbor_i, hashsize, &hashcount); 00866 /* this may report MERGEfacet */ 00867 } 00868 } 00869 } 00870 } 00871 } 00872 if (hashcount) { 00873 fprintf (qh ferr, "qhull internal error (qh_matchnewfacets): %d neighbors did not match up\n", 00874 hashcount); 00875 qh_printhashtable (qh ferr); 00876 qh_errexit (qh_ERRqhull, NULL, NULL); 00877 } 00878 #ifndef qh_NOtrace 00879 if (qh IStracing >= 2) { 00880 FOREACHfacet_i_(qh hash_table) { 00881 if (!facet) 00882 numfree++; 00883 } 00884 fprintf (qh ferr, "qh_matchnewfacets: %d new facets, %d unused hash entries . hashsize %d\n", 00885 numnew, numfree, qh_setsize (qh hash_table)); 00886 } 00887 #endif /* !qh_NOtrace */ 00888 qh_setfree (&qh hash_table); 00889 if (qh PREmerge || qh MERGEexact) { 00890 if (qh IStracing >= 4) 00891 qh_printfacetlist (qh newfacet_list, NULL, qh_ALL); 00892 FORALLnew_facets { 00893 if (newfacet->normal) 00894 qh_checkflipped (newfacet, NULL, qh_ALL); 00895 } 00896 }else if (qh FORCEoutput) 00897 qh_checkflipped_all (qh newfacet_list); /* prints warnings for flipped */ 00898 } /* matchnewfacets */ |
|
Definition at line 921 of file poly.c. References boolT, qh, SETelemaddr_, SETindex_, and trace4. Referenced by qh_matchduplicates(), and qh_matchneighbor().
00922 { 00923 vertexT **elemAp, **elemBp, **skipBp=NULL, **skipAp; 00924 00925 elemAp= SETelemaddr_(verticesA, firstindex, vertexT); 00926 elemBp= SETelemaddr_(verticesB, firstindex, vertexT); 00927 skipAp= SETelemaddr_(verticesA, skipA, vertexT); 00928 do if (elemAp != skipAp) { 00929 while (*elemAp != *elemBp++) { 00930 if (skipBp) 00931 return False; 00932 skipBp= elemBp; /* one extra like FOREACH */ 00933 } 00934 }while(*(++elemAp)); 00935 if (!skipBp) 00936 skipBp= ++elemBp; 00937 *skipB= SETindex_(verticesB, skipB); 00938 *same= !(((ptr_intT)skipA & 0x1) ^ ((ptr_intT)*skipB & 0x1)); 00939 trace4((qh ferr, "qh_matchvertices: matched by skip %d (v%d) and skip %d (v%d) same? %d\n", 00940 skipA, (*skipAp)->id, *skipB, (*(skipBp-1))->id, *same)); 00941 return (True); 00942 } /* matchvertices */ |
|
Definition at line 954 of file poly.c. References facetT::furthestdist, facetT::good, facetT::id, facetT::maxoutside, facetT::neighbors, facetT::newfacet, qh, qh_memalloc_, qh_setnew(), facetT::simplicial, and trace4. Referenced by qh_createsimplex(), and qh_makenewfacet().
00954 { 00955 facetT *facet; 00956 void **freelistp; /* used !qh_NOmem */ 00957 00958 qh_memalloc_(sizeof(facetT), freelistp, facet, facetT); 00959 memset ((char *)facet, 0, sizeof(facetT)); 00960 if (qh facet_id == qh tracefacet_id) 00961 qh tracefacet= facet; 00962 facet->id= qh facet_id++; 00963 facet->neighbors= qh_setnew(qh hull_dim); 00964 #if !qh_COMPUTEfurthest 00965 facet->furthestdist= 0.0; 00966 #endif 00967 #if qh_MAXoutside 00968 if (qh FORCEoutput && qh APPROXhull) 00969 facet->maxoutside= qh MINoutside; 00970 else 00971 facet->maxoutside= qh DISTround; 00972 #endif 00973 facet->simplicial= True; 00974 facet->good= True; 00975 facet->newfacet= True; 00976 trace4((qh ferr, "qh_newfacet: created facet f%d\n", facet->id)); 00977 return (facet); 00978 } /* newfacet */ |
|
Definition at line 987 of file poly.c. References ridgeT::id, qh, qh_memalloc_, trace4, zinc_, and Ztotridges. Referenced by qh_makeridges(), and qh_mergecycle_ridges().
00987 { 00988 ridgeT *ridge; 00989 void **freelistp; /* used !qh_NOmem */ 00990 00991 qh_memalloc_(sizeof(ridgeT), freelistp, ridge, ridgeT); 00992 memset ((char *)ridge, 0, sizeof(ridgeT)); 00993 zinc_(Ztotridges); 00994 if (qh ridge_id == 0xFFFFFF) { 00995 fprintf(qh ferr, "\ 00996 qhull warning: more than %d ridges. ID field overflows and two ridges\n\ 00997 may have the same identifier. Otherwise output ok.\n", 0xFFFFFF); 00998 } 00999 ridge->id= qh ridge_id++; 01000 trace4((qh ferr, "qh_newridge: created ridge r%d\n", ridge->id)); 01001 return (ridge); 01002 } /* newridge */ |
|
|
Definition at line 1048 of file poly.c. References facetT::id, facetT::next, facetT::previous, qh, and trace4. Referenced by qh_checkconnect(), qh_delfacet(), qh_findgooddist(), qh_findhorizon(), qh_furthestnext(), qh_mergecycle_facets(), qh_mergefacet(), qh_nextfurthest(), qh_partitionpoint(), and qh_willdelete().
01048 { 01049 facetT *next= facet->next, *previous= facet->previous; 01050 01051 if (facet == qh newfacet_list) 01052 qh newfacet_list= next; 01053 if (facet == qh facet_next) 01054 qh facet_next= next; 01055 if (facet == qh visible_list) 01056 qh visible_list= next; 01057 if (previous) { 01058 previous->next= next; 01059 next->previous= previous; 01060 }else { /* 1st facet in qh facet_list */ 01061 qh facet_list= next; 01062 qh facet_list->previous= NULL; 01063 } 01064 qh num_facets--; 01065 trace4((qh ferr, "qh_removefacet: remove f%d from facet_list\n", facet->id)); 01066 } /* removefacet */ |
|
Definition at line 1079 of file poly.c. References vertexT::id, vertexT::next, vertexT::previous, qh, and trace4. Referenced by qh_delvertex(), qh_makenewfacet(), qh_mergesimplex(), and qh_newvertices().
01079 { 01080 vertexT *next= vertex->next, *previous= vertex->previous; 01081 01082 if (vertex == qh newvertex_list) 01083 qh newvertex_list= next; 01084 if (previous) { 01085 previous->next= next; 01086 next->previous= previous; 01087 }else { /* 1st vertex in qh vertex_list */ 01088 qh vertex_list= vertex->next; 01089 qh vertex_list->previous= NULL; 01090 } 01091 qh num_vertices--; 01092 trace4((qh ferr, "qh_removevertex: remove v%d from vertex_list\n", vertex->id)); 01093 } /* removevertex */ |
|
Definition at line 1115 of file poly.c. References vertexT::deleted, FORALLnew_facets, FORALLvertex_, FORALLvisible_facets, FOREACHneighbor_, FOREACHvertex_, vertexT::id, facetT::id, vertexT::neighbors, vertexT::newlist, vertexT::point, qh, qh_pointid(), qh_setappend(), qh_setcompact(), qh_setdel(), SETref_, trace2, trace3, facetT::vertices, and facetT::visible. Referenced by qh_addpoint().
01115 { 01116 facetT *newfacet= NULL, *neighbor, **neighborp, *visible; 01117 vertexT *vertex, **vertexp; 01118 01119 trace3((qh ferr, "qh_updatevertices: delete interior vertices and update vertex->neighbors\n")); 01120 if (qh VERTEXneighbors) { 01121 FORALLvertex_(qh newvertex_list) { 01122 FOREACHneighbor_(vertex) { 01123 if (neighbor->visible) 01124 SETref_(neighbor)= NULL; 01125 } 01126 qh_setcompact (vertex->neighbors); 01127 } 01128 FORALLnew_facets { 01129 FOREACHvertex_(newfacet->vertices) 01130 qh_setappend (&vertex->neighbors, newfacet); 01131 } 01132 FORALLvisible_facets { 01133 FOREACHvertex_(visible->vertices) { 01134 if (!vertex->newlist && !vertex->deleted) { 01135 FOREACHneighbor_(vertex) { /* this can happen under merging */ 01136 if (!neighbor->visible) 01137 break; 01138 } 01139 if (neighbor) 01140 qh_setdel (vertex->neighbors, visible); 01141 else { 01142 vertex->deleted= True; 01143 qh_setappend (&qh del_vertices, vertex); 01144 trace2((qh ferr, "qh_updatevertices: delete vertex p%d (v%d) in f%d\n", 01145 qh_pointid(vertex->point), vertex->id, visible->id)); 01146 } 01147 } 01148 } 01149 } 01150 }else { /* !VERTEXneighbors */ 01151 FORALLvisible_facets { 01152 FOREACHvertex_(visible->vertices) { 01153 if (!vertex->newlist && !vertex->deleted) { 01154 vertex->deleted= True; 01155 qh_setappend (&qh del_vertices, vertex); 01156 trace2((qh ferr, "qh_updatevertices: delete vertex p%d (v%d) in f%d\n", 01157 qh_pointid(vertex->point), vertex->id, visible->id)); 01158 } 01159 } 01160 } 01161 } 01162 } /* updatevertices */ |