void update_neighbours_dense(int parent_id) { GraphNodeStruct g = DenseNodes[parent_id]; float cur_dist = g.distance; foreach (int nbr_id in NeighboursF(parent_id)) { if (NodeFilterF(nbr_id) == false) { continue; } GraphNodeStruct nbr = DenseNodes[nbr_id]; if (nbr.frozen) { continue; } float nbr_dist = NodeDistanceF(parent_id, nbr_id) + cur_dist; if (DenseQueue.Contains(nbr_id)) { if (nbr_dist < nbr.distance) { nbr.parent = parent_id; DenseQueue.Update(nbr_id, nbr_dist); DenseNodes[nbr_id] = nbr; } } else { enqueue_node_dense(nbr_id, nbr_dist); } } }
// update queue weight for each edge in vertex one-ring protected virtual void UpdateNeighbours(int vid) { foreach (int eid in mesh.VtxEdgesItr(vid)) { Index2i nev = mesh.GetEdgeV(eid); QuadricError Q = new QuadricError(ref vertQuadrics[nev.a], ref vertQuadrics[nev.b]); Vector3d opt = OptimalPoint(eid, ref Q, nev.a, nev.b); double err = Q.Evaluate(ref opt); EdgeQuadrics[eid] = new QEdge(eid, ref Q, ref opt); if (EdgeQueue.Contains(eid)) { EdgeQueue.Update(eid, (float)err); } else { EdgeQueue.Insert(eid, (float)err); } } }