Example #1
0
        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);
         }
     }
 }