int AdFront2 :: GetLocals (int baselineindex, Array<Point3d> & locpoints, Array<MultiPointGeomInfo> & pgeominfo, Array<INDEX_2> & loclines, // local index Array<INDEX> & pindex, Array<INDEX> & lindex, double xh) { static int timer = NgProfiler::CreateTimer ("adfront2::GetLocals"); NgProfiler::RegionTimer reg (timer); int pstind; Point<3> midp, p0; pstind = lines[baselineindex].L().I1(); p0 = points[pstind].P(); loclines.Append(lines[baselineindex].L()); lindex.Append(baselineindex); ArrayMem<int, 1000> nearlines(0); ArrayMem<int, 1000> nearpoints(0); // dominating costs !! linesearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh), p0 + Vec3d(xh, xh, xh), nearlines); pointsearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh), p0 + Vec3d(xh, xh, xh), nearpoints); for (int ii = 0; ii < nearlines.Size(); ii++) { int i = nearlines[ii]; if (lines[i].Valid() && i != baselineindex) { loclines.Append(lines[i].L()); lindex.Append(i); } } // static Array<int> invpindex; invpindex.SetSize (points.Size()); // invpindex = -1; for (int i = 0; i < nearpoints.Size(); i++) invpindex[nearpoints[i]] = -1; for (int i = 0; i < loclines.Size(); i++) { invpindex[loclines[i].I1()] = 0; invpindex[loclines[i].I2()] = 0; } for (int i = 0; i < loclines.Size(); i++) { for (int j = 0; j < 2; j++) { int pi = loclines[i][j]; if (invpindex[pi] == 0) { pindex.Append (pi); invpindex[pi] = pindex.Size(); loclines[i][j] = locpoints.Append (points[pi].P()); } else loclines[i][j] = invpindex[pi]; } } // double xh2 = xh*xh; for (int ii = 0; ii < nearpoints.Size(); ii++) { int i = nearpoints[ii]; if (points[i].Valid() && points[i].OnSurface() && // Dist2 (points.Get(i).P(), p0) <= xh2 && invpindex[i] <= 0) { invpindex[i] = locpoints.Append (points[i].P()); pindex.Append(i); } } /* double xh2 = xh*xh; for (i = 1; i <= points.Size(); i++) { if (points.Get(i).Valid() && points.Get(i).OnSurface() && Dist2 (points.Get(i).P(), p0) <= xh2 && invpindex.Get(i) <= 0) { invpindex.Elem(i) = locpoints.Append (points.Get(i).P()); pindex.Append(i); } } */ pgeominfo.SetSize (locpoints.Size()); for (int i = 0; i < pgeominfo.Size(); i++) pgeominfo[i].Init(); for (int i = 0; i < loclines.Size(); i++) for (int j = 0; j < 2; j++) { int lpi = loclines[i][j]; const PointGeomInfo & gi = lines[lindex[i]].GetGeomInfo (j+1); pgeominfo.Elem(lpi).AddPointGeomInfo (gi); /* if (pgeominfo.Elem(lpi).cnt == MULTIPOINTGEOMINFO_MAX) break; const PointGeomInfo & gi = lines.Get(lindex.Get(i)).GetGeomInfo (j); PointGeomInfo * pgi = pgeominfo.Elem(lpi).mgi; int found = 0; for (k = 0; k < pgeominfo.Elem(lpi).cnt; k++) if (pgi[k].trignum == gi.trignum) found = 1; if (!found) { pgi[pgeominfo.Elem(lpi).cnt] = gi; pgeominfo.Elem(lpi).cnt++; } */ } for (int i = 0; i < locpoints.Size(); i++) { int pi = pindex[i]; if (points[pi].mgi) for (int j = 1; j <= points[pi].mgi->GetNPGI(); j++) pgeominfo[i].AddPointGeomInfo (points[pi].mgi->GetPGI(j)); } if (loclines.Size() == 1) { (*testout) << "loclines.size = 1" << endl << " h = " << xh << endl << " nearline.size = " << nearlines.Size() << endl << " p0 = " << p0 << endl; } return lines[baselineindex].LineClass(); }
int AdFront2 :: GetLocals (int baselineindex, Array<Point3d> & locpoints, Array<MultiPointGeomInfo> & pgeominfo, Array<INDEX_2> & loclines, // local index Array<INDEX> & pindex, Array<INDEX> & lindex, double xh) { int pstind; Point<3> midp, p0; pstind = lines[baselineindex].L().I1(); p0 = points[pstind].P(); loclines.Append(lines[baselineindex].L()); lindex.Append(baselineindex); ArrayMem<int, 1000> nearlines(0); ArrayMem<int, 1000> nearpoints(0); // dominating costs !! linesearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh), p0 + Vec3d(xh, xh, xh), nearlines); pointsearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh), p0 + Vec3d(xh, xh, xh), nearpoints); for (int ii = 0; ii < nearlines.Size(); ii++) { int i = nearlines[ii]; if (lines[i].Valid() && i != baselineindex) { loclines.Append(lines[i].L()); lindex.Append(i); } } // static Array<int> invpindex; invpindex.SetSize (points.Size()); // invpindex = -1; for (int i = 0; i < nearpoints.Size(); i++) invpindex[nearpoints[i]] = -1; for (int i = 0; i < loclines.Size(); i++) { invpindex[loclines[i].I1()] = 0; invpindex[loclines[i].I2()] = 0; } for (int i = 0; i < loclines.Size(); i++) { for (int j = 0; j < 2; j++) { int pi = loclines[i][j]; if (invpindex[pi] == 0) { pindex.Append (pi); invpindex[pi] = pindex.Size(); loclines[i][j] = locpoints.Append (points[pi].P()); } else loclines[i][j] = invpindex[pi]; } } // double xh2 = xh*xh; for (int ii = 0; ii < nearpoints.Size(); ii++) { int i = nearpoints[ii]; if (points[i].Valid() && points[i].OnSurface() && // Dist2 (points.Get(i).P(), p0) <= xh2 && invpindex[i] <= 0) { invpindex[i] = locpoints.Append (points[i].P()); pindex.Append(i); } } pgeominfo.SetSize (locpoints.Size()); for (int i = 0; i < pgeominfo.Size(); i++) pgeominfo[i].Init(); for (int i = 0; i < loclines.Size(); i++) for (int j = 0; j < 2; j++) { int lpi = loclines[i][j]; const PointGeomInfo & gi = lines[lindex[i]].GetGeomInfo (j+1); pgeominfo.Elem(lpi).AddPointGeomInfo (gi); } for (int i = 0; i < locpoints.Size(); i++) { int pi = pindex[i]; if (points[pi].mgi) for (int j = 1; j <= points[pi].mgi->GetNPGI(); j++) pgeominfo[i].AddPointGeomInfo (points[pi].mgi->GetPGI(j)); } if (loclines.Size() == 1) { cout << "loclines.size = 1" << endl << " h = " << xh << endl << " nearline.size = " << nearlines.Size() << endl << " p0 = " << p0 << endl; } return lines[baselineindex].LineClass(); }