Beispiel #1
0
        }//使用父节点的信息初始化子节点的范围

        public static void Test()
        {
            RegionOctree <byte> tree = new RegionOctree <byte>(2047, 480, 1250);

            //tree.AddLeafNode(0, 0, 0,0);
            tree.CreateToLeafNode(0, 0, 0);
            tree.CreateToLeafNode(0, 0, 1);
            tree.CreateToLeafNode(0, 0, 2);
            tree.CreateToLeafNode(0, 0, 3);
            tree.CreateToLeafNode(0, 0, 4);
            tree.CreateToLeafNode(0, 0, 5);
            tree.CreateToLeafNode(0, 0, 6);
            tree.CreateToLeafNode(0, 0, 7);
            tree.CreateToLeafNode(0, 0, 8);
            tree.CreateToLeafNode(0, 0, 9);
            tree.CreateToLeafNode(0, 0, 10);
            tree.CreateToLeafNode(0, 0, 11);

            Console.WriteLine(tree);
        }
        public static Mesh GenerateSurface(BitMap3d bmp)
        {
            int width  = bmp.width;
            int height = bmp.height;
            int depth  = bmp.depth;

            Int16Triple[] tempArray = new Int16Triple[8];
            #region CreateTree
            RegionOctree <NodeParms>        otree     = new RegionOctree <NodeParms>(width, height, depth);
            Queue <OctreeNode <NodeParms> > nodequeue = new Queue <OctreeNode <NodeParms> >();
            for (int k = 0; k < depth - 1; k++)
            {
                for (int j = 0; j < height - 1; j++)
                {
                    for (int i = 0; i < width - 1; i++)
                    {
                        byte value = 0;
                        for (int pi = 0; pi < 8; pi++)
                        {
                            tempArray[pi].X = i + PointIndexToPointDelta[pi].X;
                            tempArray[pi].Y = j + PointIndexToPointDelta[pi].Y;
                            tempArray[pi].Z = k + PointIndexToPointDelta[pi].Z;
                            if (InRange(bmp, tempArray[pi].X, tempArray[pi].Y, tempArray[pi].Z) &&
                                IsWhite(bmp, tempArray[pi].X, tempArray[pi].Y, tempArray[pi].Z))
                            {
                                value |= PointIndexToFlag[pi];
                            }
                        }
                        if (value != 0 && value != 255)
                        {
                            OctreeNode <NodeParms> leafnode = otree.CreateToLeafNode(i, j, k);
                            leafnode.Parms              = new NodeParms();
                            leafnode.Parms.Config       = value;
                            leafnode.Parms.NormalTypeId = OctreeTable.ConfigToNormalTypeId[value];
                            leafnode.Parms.D            = CaculateDFromNormalAndCoord(i, j, k, value);
                            nodequeue.Enqueue(leafnode.Parent);
                        }
                    }
                }
            }
            #endregion
            #region Shrink
            while (nodequeue.Count != 0)
            {
                OctreeNode <NodeParms> node = nodequeue.Dequeue();
                byte normalType             = OctreeTable.NormalNotSimple;
                int  D = int.MinValue;
                if (CanMergeNode(node, ref normalType, ref D))
                {
                    node.Parms = new NodeParms();
                    //node.Parms.Config = GetConfigFromChildren(node.Children);
                    node.Parms.NormalTypeId = normalType;
                    node.Parms.D            = D;
                    nodequeue.Enqueue(node.Parent);
                }
            }
            #endregion
            #region ExtractTriangles
            MeshBuilder_IntegerVertex mb = new MeshBuilder_IntegerVertex(width + 1, height + 1, depth + 1);
            nodequeue.Enqueue(otree.Root);
            while (nodequeue.Count != 0)
            {
                OctreeNode <NodeParms> node = nodequeue.Dequeue();
                if (node.Parms == null)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        if (node.Children[i] != null)
                        {
                            nodequeue.Enqueue(node.Children[i]);
                        }
                    }
                }
                else
                {
                    if (node.Parms.NormalTypeId != OctreeTable.NormalNotSimple)
                    {
                        if (node.IsLeaf())
                        {
                            GenerateFaceLeaf(node, mb, ref tempArray, bmp);
                        }
                        else
                        {
                            GenerateFace(node, mb, ref tempArray, bmp);
                        }
                    }
                    else
                    {
                        if (node.IsLeaf())
                        {
                            GenerateFaceLeaf(node, mb, ref tempArray, bmp);
                        }
                        else
                        {
                            for (int i = 0; i < 8; i++)
                            {
                                if (node.Children[i] != null)
                                {
                                    nodequeue.Enqueue(node.Children[i]);
                                }
                            }
                        }
                    }
                }
            }//采用层次遍历寻找需要抽取三角片的节点
            #endregion
            return(mb.GetMesh());
        }