/// <summary> /// Adds the color. /// </summary> /// <param name="color">The color.</param> /// <param name="level">The level.</param> /// <param name="parent">The parent.</param> public void AddColor(Color color, Int32 level, OctreeQuantizer parent) { // if this node is a leaf, then increase a color amount, and pixel presence if (level == 8) { red += color.R; green += color.G; blue += color.B; pixelCount++; } else if (level < 8) // otherwise goes one level deeper { // calculates an index for the next sub-branch Int32 index = GetColorIndexAtLevel(color, level); // if that branch doesn't exist, grows it if (nodes[index] == null) { nodes[index] = new OctreeNode(level, parent); } // adds a color to that branch nodes[index].AddColor(color, level + 1, parent); } }
/// <summary> /// Initializes a new instance of the <see cref="OctreeNode"/> class. /// </summary> public OctreeNode(Int32 level, OctreeQuantizer parent) { nodes = new OctreeNode[8]; if (level < 7) { parent.AddLevelNode(level, this); } }
/// <summary> /// Initializes a new instance of the <see cref="OctreeNode"/> class. /// </summary> public OctreeNode(Int32 level, OctreeQuantizer parent) { nodes = new OctreeNode[8]; if (level < 7) { parent.AddLevelNode(level, this); } }
/// <summary> /// Removes the leaves by summing all it's color components and pixel presence. /// </summary> /// <returns></returns> public Int32 RemoveLeaves(Int32 level, Int32 activeColorCount, Int32 targetColorCount, OctreeQuantizer parent) { Int32 result = 0; // scans thru all the active nodes for (Int32 index = 0; index < 8; index++) { OctreeNode node = nodes[index]; if (node != null) { // sums up their color components red += node.red; green += node.green; blue += node.blue; // and pixel presence pixelCount += node.pixelCount; // increases the count of reduced nodes result++; } } // returns a number of reduced sub-nodes, minus one because this node becomes a leaf return(result - 1); }
/// <summary> /// Removes the leaves by summing all it's color components and pixel presence. /// </summary> /// <returns></returns> public Int32 RemoveLeaves(Int32 level, Int32 activeColorCount, Int32 targetColorCount, OctreeQuantizer parent) { Int32 result = 0; // scans thru all the active nodes for (Int32 index = 0; index < 8; index++) { OctreeNode node = nodes[index]; if (node != null) { // sums up their color components red += node.red; green += node.green; blue += node.blue; // and pixel presence pixelCount += node.pixelCount; // increases the count of reduced nodes result++; } } // returns a number of reduced sub-nodes, minus one because this node becomes a leaf return result - 1; }
/// <summary> /// Adds the color. /// </summary> /// <param name="color">The color.</param> /// <param name="level">The level.</param> /// <param name="parent">The parent.</param> public void AddColor(Color color, Int32 level, OctreeQuantizer parent) { // if this node is a leaf, then increase a color amount, and pixel presence if (level == 8) { red += color.R; green += color.G; blue += color.B; pixelCount++; } else if (level < 8) // otherwise goes one level deeper { // calculates an index for the next sub-branch Int32 index = GetColorIndexAtLevel(color, level); // if that branch doesn't exist, grows it if (nodes[index] == null) { nodes[index] = new OctreeNode(level, parent); } // adds a color to that branch nodes[index].AddColor(color, level + 1, parent); } }