40 switch (
qh->hull_dim){
42 *dist= facet->
offset + point[0] * normal[0] + point[1] * normal[1];
45 *dist= facet->
offset + point[0] * normal[0] + point[1] * normal[1] + point[2] * normal[2];
48 *dist= facet->
offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3];
51 *dist= facet->
offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4];
54 *dist= facet->
offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5];
57 *dist= facet->
offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6];
60 *dist= facet->
offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6]+point[7]*normal[7];
65 for (k=
qh->hull_dim; k--; )
66 *dist += *coordp++ * *normal++;
70 if (!
qh->RANDOMdist &&
qh->IStracing < 4)
75 qh->RANDOMfactor *
qh->MAXabs_coord;
77 if (
qh->IStracing >= 4) {
142 realT *dist,
boolT *isoutside,
int *numpart) {
144 facetT *facet, *neighbor, **neighborp;
145 facetT *bestfacet= NULL, *lastfacet= NULL;
146 int oldtrace=
qh->IStracing;
147 unsigned int visitid= ++
qh->visit_id;
152 if (
qh->IStracing >= 3 || (
qh->TRACElevel &&
qh->TRACEpoint >= 0 &&
qh->TRACEpoint ==
qh_pointid(
qh, point))) {
153 if (
qh->TRACElevel >
qh->IStracing)
154 qh->IStracing=
qh->TRACElevel;
155 qh_fprintf(
qh,
qh->ferr, 8004,
"qh_findbest: point p%d starting at f%d isnewfacets? %d, unless %d exit if > %2.2g\n",
156 qh_pointid(
qh, point), startfacet->
id, isnewfacets, bestoutside,
qh->MINoutside);
157 qh_fprintf(
qh,
qh->ferr, 8005,
" testhorizon? %d noupper? %d", testhorizon, noupper);
158 qh_fprintf(
qh,
qh->ferr, 8006,
" Last point added was p%d.",
qh->furthest_id);
166 if (!bestoutside && *dist >=
qh->MINoutside
168 bestfacet= startfacet;
169 goto LABELreturn_best;
173 bestfacet= startfacet;
180 trace4((
qh,
qh->ferr, 4001,
"qh_findbest: neighbors of f%d, bestdist %2.2g f%d\n",
181 facet->
id, bestdist,
getid_(bestfacet)));
184 if (!neighbor->
newfacet && isnewfacets)
186 if (neighbor->
visitid == visitid)
192 if (*dist > bestdist) {
193 if (!bestoutside && *dist >=
qh->MINoutside
196 goto LABELreturn_best;
202 }
else if (!bestfacet) {
214 bestfacet=
qh_findbestnew(
qh, point, startfacet->
next, &bestdist, bestoutside, isoutside, &numpartnew);
216 }
else if (!
qh->findbest_notsharp && bestdist < - qh->DISTround) {
220 bestfacet=
qh_findbestnew(
qh, point, bestfacet, &bestdist, bestoutside, isoutside, &numpartnew);
224 qh->findbest_notsharp=
True;
232 if (isoutside && bestdist < qh->MINoutside)
237 (*numpart) += numpartnew;
238 qh->IStracing= oldtrace;
282 facetT *bestfacet= startfacet;
284 facetT *neighbor, **neighborp, *facet;
286 int numpartinit= *numpart, coplanarfacetset_size;
287 unsigned int visitid= ++
qh->visit_id;
289 realT minsearch, searchdist;
295 if ((!
qh->ONLYgood || startfacet->
good) && *bestdist > startfacet->
maxoutside)
300 minsearch= *bestdist - searchdist;
305 coplanarfacetset_size= 0;
308 trace4((
qh,
qh->ferr, 4002,
"qh_findbesthorizon: neighbors of f%d bestdist %2.2g f%d ischeckmax? %d noupper? %d minsearch %2.2g searchdist %2.2g\n",
309 facet->
id, *bestdist,
getid_(bestfacet), ischeckmax, noupper,
310 minsearch, searchdist));
312 if (neighbor->
visitid == visitid)
318 if (dist > *bestdist) {
319 if (!neighbor->
upperdelaunay || ischeckmax || (!noupper && dist >=
qh->MINoutside)) {
324 minsearch= dist - searchdist;
325 if (dist > *bestdist + searchdist) {
327 coplanarfacetset_size= 0;
331 }
else if (dist < minsearch)
334 if (ischeckmax && dist > neighbor->
maxoutside)
339 if (!coplanarfacetset_size++) {
351 else if (!coplanarfacetset_size)
353 else if (!--coplanarfacetset_size) {
365 trace4((
qh,
qh->ferr, 4003,
"qh_findbesthorizon: newbest? %d bestfacet f%d bestdist %2.2g\n", newbest,
getid_(bestfacet), *bestdist));
415 facetT *bestfacet= NULL, *facet;
416 int oldtrace=
qh->IStracing, i;
417 unsigned int visitid= ++
qh->visit_id;
418 realT distoutside= 0.0;
424 qh_fprintf(
qh,
qh->ferr, 6001,
"qhull precision error (qh_findbestnew): merging has formed and deleted a cone of new facets. Can not continue.\n");
426 qh_fprintf(
qh,
qh->ferr, 6002,
"qhull internal error (qh_findbestnew): no new facets for point p%d\n",
431 if (
qh->BESToutside || bestoutside)
432 isdistoutside=
False;
440 if (
qh->IStracing >= 3 || (
qh->TRACElevel &&
qh->TRACEpoint >= 0 &&
qh->TRACEpoint ==
qh_pointid(
qh, point))) {
441 if (
qh->TRACElevel >
qh->IStracing)
442 qh->IStracing=
qh->TRACElevel;
443 qh_fprintf(
qh,
qh->ferr, 8008,
"qh_findbestnew: point p%d facet f%d. Stop? %d if dist > %2.2g\n",
444 qh_pointid(
qh, point), startfacet->
id, isdistoutside, distoutside);
445 qh_fprintf(
qh,
qh->ferr, 8009,
" Last point added p%d visitid %d.",
qh->furthest_id, visitid);
449 for (i=0, facet=startfacet; i < 2; i++, facet=
qh->newfacet_list) {
451 if (facet == startfacet && i)
453 facet->visitid= visitid;
454 if (!facet->flipped) {
457 if (*dist > bestdist) {
458 if (!facet->upperdelaunay || *dist >=
qh->MINoutside) {
460 if (isdistoutside && *dist >= distoutside)
461 goto LABELreturn_bestnew;
468 if (testhorizon || !bestfacet)
472 if (isoutside && *dist < qh->MINoutside)
477 trace4((
qh,
qh->ferr, 4004,
"qh_findbestnew: bestfacet f%d bestdist %2.2g\n",
getid_(bestfacet), *dist));
478 qh->IStracing= oldtrace;
524 coordT *normalp, *normal_tail, *ai, *ak;
529 normalp= normal + numcol - 1;
530 *normalp--= (sign ? -1.0 : 1.0);
531 for (i=numrow; i--; ) {
535 for (j=i+1; j < numcol; j++)
536 *normalp -= *ai++ * *ak++;
545 *(normalp--)= (sign ? -1.0 : 1.0);
546 for (normal_tail= normalp+2; normal_tail < normal + numcol; normal_tail++)
555 trace4((
qh,
qh->ferr, 4005,
"qh_backnormal: zero diagonal at column %d.\n", i));
582 realT *ai, *ak, *rowp, *pivotrow;
583 realT n, pivot, pivot_abs= 0.0, temp;
584 int i, j, k, pivoti, flip=0;
587 for (k=0; k < numrow; k++) {
590 for (i=k+1; i < numrow; i++) {
591 if ((temp=
fabs_((
rows[i])[k])) > pivot_abs) {
603 if (pivot_abs <= qh->NEARzero[k]) {
605 if (pivot_abs == 0.0) {
606 if (
qh->IStracing >= 4) {
607 qh_fprintf(
qh,
qh->ferr, 8011,
"qh_gausselim: 0 pivot at column %d. (%2.2g < %2.2g)\n", k, pivot_abs,
qh->DISTround);
615 pivotrow=
rows[k] + k;
617 for (i=k+1; i < numrow; i++) {
621 for (j= numcol - (k+1); j--; )
628 if (
qh->IStracing >= 5)
645 realT angle= 0, randr;
648 for (k=
qh->hull_dim; k--; )
649 angle += *vect1++ * *vect2++;
650 if (
qh->RANDOMdist) {
655 trace4((
qh,
qh->ferr, 4006,
"qh_getangle: %2.2g\n", angle));
676 qh_fprintf(
qh,
qh->ferr, 6003,
"qhull internal error (qh_getcenter): not defined for %d points\n", count);
680 for (k=0; k <
qh->hull_dim; k++) {
684 *coord += vertex->
point[k];
709 trace4((
qh,
qh->ferr, 4007,
"qh_getcentrum: for f%d, %d vertices dist= %2.2g\n",
730 realT dist, maxd, mind;
744 else if (dist > maxd)
807 realT *colp, *maxp, norm= 0, temp, *norm1, *norm2, *norm3;
814 norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1));
816 norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2));
818 norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2)
819 + (*norm3)*(*norm3));
821 norm= (*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2)
823 for (k=
dim-4, colp=normal+4; k--; colp++)
824 norm += (*colp) * (*colp);
834 if (norm >
qh->MINdenom) {
849 for (k=
dim-4, colp=normal+4; k--; )
852 }
else if (norm == 0.0) {
854 for (k=
dim, colp=normal; k--; )
859 for (k=
dim, colp=normal; k--; colp++) {
860 temp=
qh_divzero(*colp, norm,
qh->MINdenom_1, &zerodiv);
865 temp= ((*maxp * norm >= 0.0) ? 1.0 : -1.0);
866 for (k=
dim, colp=normal; k--; colp++)
870 trace0((
qh,
qh->ferr, 1,
"qh_normalize: norm=%2.2g too small during p%d\n",
871 norm,
qh->furthest_id));
894 pointT *newpoint, *np, *normal;
895 int normsize=
qh->normal_size;
902 for (k=
qh->hull_dim; k--; )
903 *(np++)= *point++ - dist * *normal++;
932 int normsize=
qh->normal_size;
933 int k,i, oldtrace= 0;
943 if (facet ==
qh->tracefacet) {
944 oldtrace=
qh->IStracing;
946 qh_fprintf(
qh,
qh->ferr, 8012,
"qh_setfacetplane: facet f%d created.\n", facet->
id);
947 qh_fprintf(
qh,
qh->ferr, 8013,
" Last point added to hull was p%d.",
qh->furthest_id);
953 if (
qh->hull_dim <= 4) {
955 if (
qh->RANDOMdist) {
956 gmcoord=
qh->gm_matrix;
958 qh->gm_row[i++]= gmcoord;
959 coord= vertex->
point;
960 for (k=
qh->hull_dim; k--; )
965 qh->gm_row[i++]= vertex->
point;
970 if (
qh->hull_dim > 4 || nearzero) {
972 gmcoord=
qh->gm_matrix;
974 if (vertex->
point != point0) {
975 qh->gm_row[i++]= gmcoord;
976 coord= vertex->
point;
978 for (k=
qh->hull_dim; k--; )
979 *(gmcoord++)= *coord++ - *point++;
982 qh->gm_row[i]= gmcoord;
983 if (
qh->RANDOMdist) {
984 gmcoord=
qh->gm_matrix;
985 for (i=
qh->hull_dim-1; i--; ) {
986 for (k=
qh->hull_dim; k--; )
994 trace0((
qh,
qh->ferr, 2,
"qh_setfacetplane: flipped orientation after testing interior_point during p%d\n",
qh->furthest_id));
1010 if (
qh->UPPERdelaunay) {
1018 if (
qh->PRINTstatistics ||
qh->IStracing ||
qh->TRACElevel ||
qh->JOGGLEmax <
REALmax) {
1019 qh->old_randomdist=
qh->RANDOMdist;
1022 if (vertex->
point != point0) {
1031 if (dist >
qh->max_outside) {
1032 qh->max_outside= dist;
1033 if (dist >
qh->TRACEdist)
1036 }
else if (-dist >
qh->TRACEdist)
1039 qh_fprintf(
qh,
qh->ferr, 8016,
"qh_setfacetplane: ====== vertex p%d(v%d) increases max_outside to %2.2g for new facet f%d last p%d\n",
1045 qh->RANDOMdist=
qh->old_randomdist;
1047 if (
qh->IStracing >= 3) {
1048 qh_fprintf(
qh,
qh->ferr, 8017,
"qh_setfacetplane: f%d offset %2.2g normal: ",
1050 for (k=0; k <
qh->hull_dim; k++)
1054 if (facet ==
qh->tracefacet)
1055 qh->IStracing= oldtrace;
1105 realT maxround, dist;
1114 *offset= -(point0[0]*normal[0]+point0[1]*normal[1]);
1116 }
else if (
dim == 3) {
1124 *offset= -(point0[0]*normal[0] + point0[1]*normal[1]
1125 + point0[2]*normal[2]);
1126 maxround=
qh->DISTround;
1127 for (i=
dim; i--; ) {
1129 if (point != point0) {
1130 dist= *offset + (point[0]*normal[0] + point[1]*normal[1]
1131 + point[2]*normal[2]);
1132 if (dist > maxround || dist < -maxround) {
1138 }
else if (
dim == 4) {
1140 dY(1,0),
dZ(1,0),
dW(1,0),
1141 dY(3,0),
dZ(3,0),
dW(3,0));
1143 dX(1,0),
dZ(1,0),
dW(1,0),
1144 dX(3,0),
dZ(3,0),
dW(3,0));
1146 dX(1,0),
dY(1,0),
dW(1,0),
1147 dX(3,0),
dY(3,0),
dW(3,0));
1149 dX(1,0),
dY(1,0),
dZ(1,0),
1150 dX(3,0),
dY(3,0),
dZ(3,0));
1152 *offset= -(point0[0]*normal[0] + point0[1]*normal[1]
1153 + point0[2]*normal[2] + point0[3]*normal[3]);
1154 maxround=
qh->DISTround;
1155 for (i=
dim; i--; ) {
1157 if (point != point0) {
1158 dist= *offset + (point[0]*normal[0] + point[1]*normal[1]
1159 + point[2]*normal[2] + point[3]*normal[3]);
1160 if (dist > maxround || dist < -maxround) {
1169 trace0((
qh,
qh->ferr, 3,
"qh_sethyperplane_det: degenerate norm during p%d.\n",
qh->furthest_id));
1203 coordT *pointcoord, *normalcoef;
1208 for (k=
dim-1; k--; ) {
1209 if ((
rows[k])[k] < 0)
1214 trace0((
qh,
qh->ferr, 4,
"qh_sethyperplane_gauss: nearly singular or axis parallel hyperplane during p%d.\n",
qh->furthest_id));
1220 trace0((
qh,
qh->ferr, 5,
"qh_sethyperplane_gauss: singular or axis parallel hyperplane at normalization during p%d.\n",
qh->furthest_id));
1228 *offset= -(*pointcoord++ * *normalcoef++);
1229 for (k=
dim-1; k--; )
1230 *offset -= *pointcoord++ * *normalcoef++;