void HACD::InitializeDualGraph() { long i, j, k; Vec3<Real> u, v, w, normal; delete [] m_normals; m_normals = new Vec3<Real>[m_nPoints]; if (m_addFacesPoints) { delete [] m_facePoints; delete [] m_faceNormals; m_facePoints = new Vec3<Real>[m_nTriangles]; m_faceNormals = new Vec3<Real>[m_nTriangles]; /* m_facePoints = new Vec3<Real>[4*m_nTriangles]; m_faceNormals = new Vec3<Real>[4*m_nTriangles]; */ } memset(m_normals, 0, sizeof(Vec3<Real>) * m_nPoints); RaycastMesh rm; if (m_addExtraDistPoints) { rm.Initialize(m_nPoints, m_nTriangles, m_points, m_triangles, 15); m_extraDistPoints = new Vec3<Real>[m_nTriangles]; m_extraDistNormals = new Vec3<Real>[m_nTriangles]; } double progressOld = -1.0; double progress = 0.0; char msg[1024]; double ptgStep = 1.0; m_area = 0.0; for(unsigned long f = 0; f < m_nTriangles; f++) { progress = f * 100.0 / m_nTriangles; if (fabs(progress-progressOld) > ptgStep && m_callBack) { sprintf(msg, "%3.2f %% \t \t \r", progress); (*m_callBack)(msg, progress, 0.0, m_nTriangles); progressOld = progress; } i = m_triangles[f].X(); j = m_triangles[f].Y(); k = m_triangles[f].Z(); m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(i, 0, false, false)); m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(j, 0, false, false)); m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(k, 0, false, false)); ICHull * ch = new ICHull(m_heapManager); m_graph.m_vertices[f].m_convexHull = ch; ch->AddPoint(m_points[i], i); ch->AddPoint(m_points[j], j); ch->AddPoint(m_points[k], k); ch->SetDistPoints(0); u = m_points[j] - m_points[i]; v = m_points[k] - m_points[i]; w = m_points[k] - m_points[j]; normal = u ^ v; m_normals[i] += normal; m_normals[j] += normal; m_normals[k] += normal; m_graph.m_vertices[f].m_surf = normal.GetNorm(); m_area += m_graph.m_vertices[f].m_surf; normal.Normalize(); m_graph.m_vertices[f].m_boudaryEdges.Insert(GetEdgeIndex(i,j)); m_graph.m_vertices[f].m_boudaryEdges.Insert(GetEdgeIndex(j,k)); m_graph.m_vertices[f].m_boudaryEdges.Insert(GetEdgeIndex(k,i)); if(m_addFacesPoints) { m_faceNormals[f] = normal; m_facePoints[f] = (m_points[i] + m_points[j] + m_points[k]) / 3.0; m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(-static_cast<long>(f)-1, 0, false, true)); } } // Now we have all the points in the KD tree, optimize the distance points insertion by running them in parallel // if possible. if (m_addExtraDistPoints) { if (m_callBack) (*m_callBack)("++ Also adding distance points\n", 0.0, 0.0, 0); progressOld = -1.0; progress = 0.0; long completed = 0; #ifdef THREAD_DIST_POINTS #pragma omp parallel for #endif for(long f = 0; f < (long)m_nTriangles; f++) { Vec3<Real> seedPoint((m_points[i] + m_points[j] + m_points[k]) / 3.0); Vec3<Real> hitPoint; Vec3<Real> hitNormal; normal = -normal; size_t faceIndex = m_nTriangles; Float dist; long hitTriangle; if (rm.Raycast(seedPoint,normal,hitTriangle,dist, hitPoint, hitNormal)) { faceIndex = hitTriangle; } if (faceIndex < m_nTriangles ) { m_extraDistPoints[f] = hitPoint; m_extraDistNormals[f] = hitNormal; m_graph.m_vertices[f].m_distPoints.PushBack(DPoint(m_nPoints+f, 0, false, true)); } // Atomic update of the progress #ifdef THREAD_DIST_POINTS #pragma omp critical #endif { completed++; progress = completed * 100.0 / m_nTriangles; if (fabs(progress-progressOld) > ptgStep && m_callBack) { sprintf(msg, "%3.2f %% \t \t \r", progress); (*m_callBack)(msg, progress, 0.0, m_nTriangles); progressOld = progress; } } } } for (size_t v = 0; v < m_nPoints; v++) { m_normals[v].Normalize(); } }
void HACD::InitializeDualGraph() { long i, j, k; Vec3<Real> u, v, w, normal; delete [] m_normals; m_normals = new Vec3<Real>[m_nPoints]; if (m_addFacesPoints) { delete [] m_facePoints; delete [] m_faceNormals; m_facePoints = new Vec3<Real>[m_nTriangles]; m_faceNormals = new Vec3<Real>[m_nTriangles]; } memset(m_normals, 0, sizeof(Vec3<Real>) * m_nPoints); for(unsigned long f = 0; f < m_nTriangles; f++) { if (m_callBack) (*m_callBack)("+ InitializeDualGraph\n", f, m_nTriangles, 0); if (gCancelRequest) return; i = m_triangles[f].X(); j = m_triangles[f].Y(); k = m_triangles[f].Z(); m_graph.m_vertices[f].m_distPoints[i].m_distOnly = false; m_graph.m_vertices[f].m_distPoints[j].m_distOnly = false; m_graph.m_vertices[f].m_distPoints[k].m_distOnly = false; ICHull * ch = new ICHull; m_graph.m_vertices[f].m_convexHull = ch; ch->AddPoint(m_points[i], i); ch->AddPoint(m_points[j], j); ch->AddPoint(m_points[k], k); ch->SetDistPoints(&m_graph.m_vertices[f].m_distPoints); u = m_points[j] - m_points[i]; v = m_points[k] - m_points[i]; w = m_points[k] - m_points[j]; normal = u ^ v; m_normals[i] += normal; m_normals[j] += normal; m_normals[k] += normal; m_graph.m_vertices[f].m_surf = normal.GetNorm(); m_graph.m_vertices[f].m_perimeter = u.GetNorm() + v.GetNorm() + w.GetNorm(); normal.Normalize(); m_graph.m_vertices[f].m_boudaryEdges.insert(GetEdgeIndex(i,j)); m_graph.m_vertices[f].m_boudaryEdges.insert(GetEdgeIndex(j,k)); m_graph.m_vertices[f].m_boudaryEdges.insert(GetEdgeIndex(k,i)); if(m_addFacesPoints) { m_faceNormals[f] = normal; m_facePoints[f] = (m_points[i] + m_points[j] + m_points[k]) / 3.0; m_graph.m_vertices[f].m_distPoints[-static_cast<long>(f)-1].m_distOnly = true; } if (m_addExtraDistPoints) {// we need a kd-tree structure to accelerate this part! long i1, j1, k1; Vec3<Real> u1, v1, normal1; normal = -normal; double distance = 0.0; double distMin = 0.0; size_t faceIndex = m_nTriangles; Vec3<Real> seedPoint((m_points[i] + m_points[j] + m_points[k]) / 3.0); long nhit = 0; for(size_t f1 = 0; f1 < m_nTriangles; f1++) { i1 = m_triangles[f1].X(); j1 = m_triangles[f1].Y(); k1 = m_triangles[f1].Z(); u1 = m_points[j1] - m_points[i1]; v1 = m_points[k1] - m_points[i1]; normal1 = (u1 ^ v1); if (normal * normal1 > 0.0) { nhit = IntersectRayTriangle(Vec3<double>(seedPoint.X(), seedPoint.Y(), seedPoint.Z()), Vec3<double>(normal.X(), normal.Y(), normal.Z()), Vec3<double>(m_points[i1].X(), m_points[i1].Y(), m_points[i1].Z()), Vec3<double>(m_points[j1].X(), m_points[j1].Y(), m_points[j1].Z()), Vec3<double>(m_points[k1].X(), m_points[k1].Y(), m_points[k1].Z()), distance); if ((nhit==1) && ((distMin > distance) || (faceIndex == m_nTriangles))) { distMin = distance; faceIndex = f1; } } } if (faceIndex < m_nTriangles ) { i1 = m_triangles[faceIndex].X(); j1 = m_triangles[faceIndex].Y(); k1 = m_triangles[faceIndex].Z(); m_graph.m_vertices[f].m_distPoints[i1].m_distOnly = true; m_graph.m_vertices[f].m_distPoints[j1].m_distOnly = true; m_graph.m_vertices[f].m_distPoints[k1].m_distOnly = true; if (m_addFacesPoints) { m_graph.m_vertices[f].m_distPoints[-static_cast<long>(faceIndex)-1].m_distOnly = true; } } } } for (size_t v = 0; v < m_nPoints; v++) { m_normals[v].Normalize(); } }