⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geometricpredicates.cpp

📁 利用C
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      if (cdztail != 0.0) {        Two_One_Product(bdxt_adyt1, bdxt_adyt0, cdztail, u3, u[2], u[1], u[0]);        u[3] = u3;        finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u,                                                finother);        finswap = finnow; finnow = finother; finother = finswap;      }    }  }  if (cdxtail != 0.0) {    if (adytail != 0.0) {      Two_Product(cdxtail, adytail, cdxt_adyt1, cdxt_adyt0);      Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdz, u3, u[2], u[1], u[0]);      u[3] = u3;      finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u,                                              finother);      finswap = finnow; finnow = finother; finother = finswap;      if (bdztail != 0.0) {        Two_One_Product(cdxt_adyt1, cdxt_adyt0, bdztail, u3, u[2], u[1], u[0]);        u[3] = u3;        finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u,                                                finother);        finswap = finnow; finnow = finother; finother = finswap;      }    }    if (bdytail != 0.0) {      negate = -cdxtail;      Two_Product(negate, bdytail, cdxt_bdyt1, cdxt_bdyt0);      Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adz, u3, u[2], u[1], u[0]);      u[3] = u3;      finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u,                                              finother);      finswap = finnow; finnow = finother; finother = finswap;      if (adztail != 0.0) {        Two_One_Product(cdxt_bdyt1, cdxt_bdyt0, adztail, u3, u[2], u[1], u[0]);        u[3] = u3;        finlength = fast_expansion_sum_zeroelim(finlength, finnow, 4, u,                                                finother);        finswap = finnow; finnow = finother; finother = finswap;      }    }  }  if (adztail != 0.0) {    wlength = scale_expansion_zeroelim(bctlen, bct, adztail, w);    finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w,                                            finother);    finswap = finnow; finnow = finother; finother = finswap;  }  if (bdztail != 0.0) {    wlength = scale_expansion_zeroelim(catlen, cat, bdztail, w);    finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w,                                            finother);    finswap = finnow; finnow = finother; finother = finswap;  }  if (cdztail != 0.0) {    wlength = scale_expansion_zeroelim(abtlen, abt, cdztail, w);    finlength = fast_expansion_sum_zeroelim(finlength, finnow, wlength, w,                                            finother);    finswap = finnow; finnow = finother; finother = finswap;  }  return finnow[finlength - 1];}REAL orient3d(REAL *pa, REAL *pb, REAL *pc, REAL *pd){  REAL adx, bdx, cdx, ady, bdy, cdy, adz, bdz, cdz;  REAL bdxcdy, cdxbdy, cdxady, adxcdy, adxbdy, bdxady;  REAL det;  REAL permanent, errbound;  REAL orient;  FPU_ROUND_DOUBLE;  adx = pa[0] - pd[0];  bdx = pb[0] - pd[0];  cdx = pc[0] - pd[0];  ady = pa[1] - pd[1];  bdy = pb[1] - pd[1];  cdy = pc[1] - pd[1];  adz = pa[2] - pd[2];  bdz = pb[2] - pd[2];  cdz = pc[2] - pd[2];  bdxcdy = bdx * cdy;  cdxbdy = cdx * bdy;  cdxady = cdx * ady;  adxcdy = adx * cdy;  adxbdy = adx * bdy;  bdxady = bdx * ady;  det = adz * (bdxcdy - cdxbdy)       + bdz * (cdxady - adxcdy)      + cdz * (adxbdy - bdxady);  permanent = (Absolute(bdxcdy) + Absolute(cdxbdy)) * Absolute(adz)            + (Absolute(cdxady) + Absolute(adxcdy)) * Absolute(bdz)            + (Absolute(adxbdy) + Absolute(bdxady)) * Absolute(cdz);  errbound = o3derrboundA * permanent;  if ((det > errbound) || (-det > errbound)) {    FPU_RESTORE;    return det;  }  orient = orient3dadapt(pa, pb, pc, pd, permanent);  FPU_RESTORE;  return orient;}/*****************************************************************************//*                                                                           *//*  incirclefast()   Approximate 2D incircle test.  Nonrobust.               *//*  incircleexact()   Exact 2D incircle test.  Robust.                       *//*  incircleslow()   Another exact 2D incircle test.  Robust.                *//*  incircle()   Adaptive exact 2D incircle test.  Robust.                   *//*                                                                           *//*               Return a positive value if the point pd lies inside the     *//*               circle passing through pa, pb, and pc; a negative value if  *//*               it lies outside; and zero if the four points are cocircular.*//*               The points pa, pb, and pc must be in counterclockwise       *//*               order, or the sign of the result will be reversed.          *//*                                                                           *//*  Only the first and last routine should be used; the middle two are for   *//*  timings.                                                                 *//*                                                                           *//*  The last three use exact arithmetic to ensure a correct answer.  The     *//*  result returned is the determinant of a matrix.  In incircle() only,     *//*  this determinant is computed adaptively, in the sense that exact         *//*  arithmetic is used only to the degree it is needed to ensure that the    *//*  returned value has the correct sign.  Hence, incircle() is usually quite *//*  fast, but will run more slowly when the input points are cocircular or   *//*  nearly so.                                                               *//*                                                                           *//*****************************************************************************/static REAL incircleadapt(REAL *pa, REAL *pb, REAL *pc, REAL *pd, 			  REAL permanent){  INEXACT REAL adx, bdx, cdx, ady, bdy, cdy;  REAL det, errbound;  INEXACT REAL bdxcdy1, cdxbdy1, cdxady1, adxcdy1, adxbdy1, bdxady1;  REAL bdxcdy0, cdxbdy0, cdxady0, adxcdy0, adxbdy0, bdxady0;  REAL bc[4], ca[4], ab[4];  INEXACT REAL bc3, ca3, ab3;  REAL axbc[8], axxbc[16], aybc[8], ayybc[16], adet[32];  int axbclen, axxbclen, aybclen, ayybclen, alen;  REAL bxca[8], bxxca[16], byca[8], byyca[16], bdet[32];  int bxcalen, bxxcalen, bycalen, byycalen, blen;  REAL cxab[8], cxxab[16], cyab[8], cyyab[16], cdet[32];  int cxablen, cxxablen, cyablen, cyyablen, clen;  REAL abdet[64];  int ablen;  REAL fin1[1152], fin2[1152];  REAL *finnow, *finother, *finswap;  int finlength;  REAL adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;  INEXACT REAL adxadx1, adyady1, bdxbdx1, bdybdy1, cdxcdx1, cdycdy1;  REAL adxadx0, adyady0, bdxbdx0, bdybdy0, cdxcdx0, cdycdy0;  REAL aa[4], bb[4], cc[4];  INEXACT REAL aa3, bb3, cc3;  INEXACT REAL ti1, tj1;  REAL ti0, tj0;  REAL u[4], v[4];  INEXACT REAL u3, v3;  REAL temp8[8], temp16a[16], temp16b[16], temp16c[16];  REAL temp32a[32], temp32b[32], temp48[48], temp64[64];  int temp8len, temp16alen, temp16blen, temp16clen;  int temp32alen, temp32blen, temp48len, temp64len;  REAL axtbb[8], axtcc[8], aytbb[8], aytcc[8];  int axtbblen, axtcclen, aytbblen, aytcclen;  REAL bxtaa[8], bxtcc[8], bytaa[8], bytcc[8];  int bxtaalen, bxtcclen, bytaalen, bytcclen;  REAL cxtaa[8], cxtbb[8], cytaa[8], cytbb[8];  int cxtaalen, cxtbblen, cytaalen, cytbblen;  REAL axtbc[8], aytbc[8], bxtca[8], bytca[8], cxtab[8], cytab[8];  int axtbclen = 0, aytbclen = 0;  int bxtcalen = 0, bytcalen = 0;  int cxtablen = 0, cytablen = 0;  REAL axtbct[16], aytbct[16], bxtcat[16], bytcat[16], cxtabt[16], cytabt[16];  int axtbctlen, aytbctlen, bxtcatlen, bytcatlen, cxtabtlen, cytabtlen;  REAL axtbctt[8], aytbctt[8], bxtcatt[8];  REAL bytcatt[8], cxtabtt[8], cytabtt[8];  int axtbcttlen, aytbcttlen, bxtcattlen, bytcattlen, cxtabttlen, cytabttlen;  REAL abt[8], bct[8], cat[8];  int abtlen, bctlen, catlen;  REAL abtt[4], bctt[4], catt[4];  int abttlen, bcttlen, cattlen;  INEXACT REAL abtt3, bctt3, catt3;  REAL negate;  INEXACT REAL bvirt;  REAL avirt, bround, around;  INEXACT REAL c;  INEXACT REAL abig;  REAL ahi, alo, bhi, blo;  REAL err1, err2, err3;  INEXACT REAL _i, _j;  REAL _0;  adx = (REAL) (pa[0] - pd[0]);  bdx = (REAL) (pb[0] - pd[0]);  cdx = (REAL) (pc[0] - pd[0]);  ady = (REAL) (pa[1] - pd[1]);  bdy = (REAL) (pb[1] - pd[1]);  cdy = (REAL) (pc[1] - pd[1]);  Two_Product(bdx, cdy, bdxcdy1, bdxcdy0);  Two_Product(cdx, bdy, cdxbdy1, cdxbdy0);  Two_Two_Diff(bdxcdy1, bdxcdy0, cdxbdy1, cdxbdy0, bc3, bc[2], bc[1], bc[0]);  bc[3] = bc3;  axbclen = scale_expansion_zeroelim(4, bc, adx, axbc);  axxbclen = scale_expansion_zeroelim(axbclen, axbc, adx, axxbc);  aybclen = scale_expansion_zeroelim(4, bc, ady, aybc);  ayybclen = scale_expansion_zeroelim(aybclen, aybc, ady, ayybc);  alen = fast_expansion_sum_zeroelim(axxbclen, axxbc, ayybclen, ayybc, adet);  Two_Product(cdx, ady, cdxady1, cdxady0);  Two_Product(adx, cdy, adxcdy1, adxcdy0);  Two_Two_Diff(cdxady1, cdxady0, adxcdy1, adxcdy0, ca3, ca[2], ca[1], ca[0]);  ca[3] = ca3;  bxcalen = scale_expansion_zeroelim(4, ca, bdx, bxca);  bxxcalen = scale_expansion_zeroelim(bxcalen, bxca, bdx, bxxca);  bycalen = scale_expansion_zeroelim(4, ca, bdy, byca);  byycalen = scale_expansion_zeroelim(bycalen, byca, bdy, byyca);  blen = fast_expansion_sum_zeroelim(bxxcalen, bxxca, byycalen, byyca, bdet);  Two_Product(adx, bdy, adxbdy1, adxbdy0);  Two_Product(bdx, ady, bdxady1, bdxady0);  Two_Two_Diff(adxbdy1, adxbdy0, bdxady1, bdxady0, ab3, ab[2], ab[1], ab[0]);  ab[3] = ab3;  cxablen = scale_expansion_zeroelim(4, ab, cdx, cxab);  cxxablen = scale_expansion_zeroelim(cxablen, cxab, cdx, cxxab);  cyablen = scale_expansion_zeroelim(4, ab, cdy, cyab);  cyyablen = scale_expansion_zeroelim(cyablen, cyab, cdy, cyyab);  clen = fast_expansion_sum_zeroelim(cxxablen, cxxab, cyyablen, cyyab, cdet);  ablen = fast_expansion_sum_zeroelim(alen, adet, blen, bdet, abdet);  finlength = fast_expansion_sum_zeroelim(ablen, abdet, clen, cdet, fin1);  det = estimate(finlength, fin1);  errbound = iccerrboundB * permanent;  if ((det >= errbound) || (-det >= errbound)) {    return det;  }  Two_Diff_Tail(pa[0], pd[0], adx, adxtail);  Two_Diff_Tail(pa[1], pd[1], ady, adytail);  Two_Diff_Tail(pb[0], pd[0], bdx, bdxtail);  Two_Diff_Tail(pb[1], pd[1], bdy, bdytail);  Two_Diff_Tail(pc[0], pd[0], cdx, cdxtail);  Two_Diff_Tail(pc[1], pd[1], cdy, cdytail);  if ((adxtail == 0.0) && (bdxtail == 0.0) && (cdxtail == 0.0)      && (adytail == 0.0) && (bdytail == 0.0) && (cdytail == 0.0)) {    return det;  }  errbound = iccerrboundC * permanent + resulterrbound * Absolute(det);  det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail)                                     - (bdy * cdxtail + cdx * bdytail))          + 2.0 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx))       + ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail)                                     - (cdy * adxtail + adx * cdytail))          + 2.0 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx))       + ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail)                                     - (ady * bdxtail + bdx * adytail))          + 2.0 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));  if ((det >= errbound) || (-det >= errbound)) {    return det;  }  finnow = fin1;  finother = fin2;  if ((bdxtail != 0.0) || (bdytail != 0.0)      || (cdxtail != 0.0) || (cdytail != 0.0)) {    Square(adx, adxadx1, adxadx0);    Square(ady, adyady1, adyady0);    Two_Two_Sum(adxadx1, adxadx0, adyady1, adyady0, aa3, aa[2], aa[1], aa[0]);    aa[3] = aa3;  }  if ((cdxtail != 0.0) || (cdytail != 0.0)      || (adxtail != 0.0) || (adytail != 0.0)) {    Square(bdx, bdxbdx1, bdxbdx0);    Square(bdy, bdybdy1, bdybdy0);    Two_Two_Sum(bdxbdx1, bdxbdx0, bdybdy1, bdybdy0, bb3, bb[2], bb[1], bb[0]);    bb[3] = bb3;  }  if ((adxtail != 0.0) || (adytail != 0.0)      || (bdxtail != 0.0) || (bdytail != 0.0)) {    Square(cdx, cdxcdx1, cdxcdx0);    Square(cdy, cdycdy1, cdycdy0);    Two_Two_Sum(cdxcdx1, cdxcdx0, cdycdy1, cdycdy0, cc3, cc[2], cc[1], cc[0]);    cc[3] = cc3;  }  if (adxtail != 0.0) {    axtbclen = scale_expansion_zeroelim(4, bc, adxtail, axtbc);    temp16alen = scale_expansion_zeroelim(axtbclen, axtbc, 2.0 * adx,                                          temp16a);    axtcclen = scale_expansion_zeroelim(4, cc, adxtail, axtcc);    temp16blen = scale_expansion_zeroelim(axtcclen, axtcc, bdy, temp16b);    axtbblen = scale_expansion_zeroelim(4, bb, adxtail, axtbb);    temp16clen = scale_expansion_zeroelim(axtbblen, axtbb, -cdy, temp16c);    temp32alen = fast_expansion_sum_zeroelim(temp16alen, temp16a,                                            temp16blen, temp16b, temp32a);    temp48len = fast_expansion_sum_zeroelim(temp16clen, temp16c,                                            temp32alen, temp32a, temp48);    finlength = fast_expansion_sum_zeroelim(finlength, finnow, temp48len,                                            temp48, finother);    finswap = finnow; finnow = finother; finother = finswap;  }  if (adytail != 0.0) {    aytbclen = scale_expansion_zeroelim(4, bc, adytail, aytbc);    temp16alen = scale_expansion_zeroelim(aytbclen, aytbc, 2.0 * ady,                                          temp16a);    aytbblen = scale_expansion_zeroelim(4, bb, adytail, aytbb);    temp16blen = scale_expansion_zeroelim(aytbblen, aytbb, cdx, temp16b);    aytcclen = scale_expansion_zeroelim(4, cc, adytail, aytcc);    temp16clen = scale_expansion_zeroelim(aytcclen, aytcc, -bdx, temp16c);    temp32alen = fast_expansi

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -