Exemplo n.º 1
0
 //============================================================
 // <T>构造OCTree颜色优化器。</T>
 //============================================================
 public FOctreeQuantizer()
 {
     for (int n = 0; n < 7; n++)
     {
         _levels[n] = new FOctreeNodes();
     }
     _root = new FOctreeNode(this, 0);
 }
Exemplo n.º 2
0
 //============================================================
 // <T>获得使用节点集合。</T>
 //============================================================
 public void FilterLeaf(FOctreeNodes leafs)
 {
     if (_pixelCount > 0)
     {
         leafs.Push(this);
     }
     for (int index = 0; index < 8; index++)
     {
         FOctreeNode node = _nodes[index];
         if (null != node)
         {
             node.FilterLeaf(leafs);
         }
     }
 }
Exemplo n.º 3
0
        //============================================================
        // <T>生成指定颜色数目的调色板。</T>
        //
        // @param count 颜色数目
        // @return 颜色列表;
        //============================================================
        public List <Color> MakePalette(int count)
        {
            // 获得所有节点
            int leafCount = _root.LeafCount();

            // 合并节点叶子
            for (int level = 6; level >= 0; level--)
            {
                FOctreeNodes nodes = _levels[level];
                if (!nodes.IsEmpty)
                {
                    nodes.Sort(new FOctreeNodeSorter());
                    foreach (FOctreeNode node in nodes)
                    {
                        leafCount -= node.RemoveLeaves();
                        if (leafCount <= count)
                        {
                            break;
                        }
                    }
                    if (leafCount <= count)
                    {
                        break;
                    }
                }
                nodes.Clear();
            }
            if (leafCount > count)
            {
                throw new FFatalException("Make palette failure. (count={0})", leafCount);
            }
            // 增加颜色列表
            int          paletteIndex = 0;
            List <Color> result       = new List <Color>();

            FilterLeaf(_leafs);
            foreach (FOctreeNode node in _leafs)
            {
                result.Add(node.Color);
                node.SetPaletteIndex(paletteIndex++);
            }
            // 检查结果
            return(result);
        }
Exemplo n.º 4
0
 //============================================================
 // <T>获得所有有效节点。</T>
 //============================================================
 public void FilterLeaf(FOctreeNodes leafs)
 {
     leafs.Clear();
     _root.FilterLeaf(leafs);
 }