Ejemplo n.º 1
0
        protected virtual void InitializeQueue()
        {
            int NE = mesh.EdgeCount;

            Nodes     = new QEdge[2 * NE];                      // [RMS] do we need this many?
            NodePool  = new MemoryPool <QEdge>(NE);
            EdgeQueue = new g3ext.FastPriorityQueue <QEdge>(NE);

            int  cur_eid = start_edges();
            bool done    = false;

            do
            {
                if (mesh.IsEdge(cur_eid))
                {
                    Index2i ev = mesh.GetEdgeV(cur_eid);

                    QuadricError Q   = new QuadricError(ref vertQuadrics[ev.a], ref vertQuadrics[ev.b]);
                    Vector3d     opt = OptimalPoint(Q, ev.a, ev.b);
                    double       err = Q.Evaluate(opt);

                    QEdge ee = NodePool.Allocate();
                    ee.Initialize(cur_eid, Q, opt);
                    Nodes[cur_eid] = ee;
                    EdgeQueue.Enqueue(ee, (float)err);
                }
                cur_eid = next_edge(cur_eid, out done);
            } while (done == false);
        }
Ejemplo n.º 2
0
 // 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(Q, nev.a, nev.b);
         double       err      = Q.Evaluate(opt);
         QEdge        eid_node = Nodes[eid];
         if (eid_node != null)
         {
             eid_node.q           = Q;
             eid_node.collapse_pt = opt;
             EdgeQueue.UpdatePriority(eid_node, (float)err);
         }
         else
         {
             QEdge ee = NodePool.Allocate();
             ee.Initialize(eid, Q, opt);
             Nodes[eid] = ee;
             EdgeQueue.Enqueue(ee, (float)err);
         }
     }
 }