}//使用父节点的信息初始化子节点的范围 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()); }