public Color3[] Clusters(int count) { Color3[] l = new Color3[count]; int p = 0; for (int i = 0; i < this.cubes.Count; i++) { ColorCube cube = this.cubes[i]; long a = 0; long b = 0; long c = 0; int cnt = cube.Pixels.Count; for (int j = 0; j < cnt; j++) { PixelInfo px = cube.Pixels[j]; a += (long)px.A; b += (long)px.B; c += (long)px.C; } l[p++] = new Color3( MedianCutClustering.UnHash((int)(a / (long)cnt), min.L, max.L), MedianCutClustering.UnHash((int)(b / (long)cnt), min.A, max.A), MedianCutClustering.UnHash((int)(c / (long)cnt), min.B, max.B)); if (p >= count) { break; } } while (p < count) { l[p++] = new Color3(0f, 0f, 0f); } return(l); }
public void SetPoints(Color3[] list) { ColorCube cube = new ColorCube(list.Length); for (int i = 0; i < list.Length; i++) { PixelInfo px = new PixelInfo(); px.A = px.B = px.C = 0; px.Index = i; cube.Pixels.Add(px); } this.max = new LabColor(); this.min = new LabColor(); for (int i = 0; i < cube.Pixels.Count; i++) { Color3 c = list[cube.Pixels[i].Index]; LabColor lab = new LabColor(c.A, c.B, c.C); if (i == 0) { min.L = max.L = lab.L; min.A = max.A = lab.A; min.B = max.B = lab.B; continue; } min.L = MedianCutClustering.Min(lab.L, min.L); min.A = MedianCutClustering.Min(lab.A, min.A); min.B = MedianCutClustering.Min(lab.B, min.B); max.L = MedianCutClustering.Max(lab.L, max.L); max.A = MedianCutClustering.Max(lab.A, max.A); max.B = MedianCutClustering.Max(lab.B, max.B); } for (int i = 0; i < cube.Pixels.Count; i++) { PixelInfo px = cube.Pixels[i]; Color3 c = list[cube.Pixels[i].Index]; LabColor lab = new LabColor(c.A, c.B, c.C); px.A = MedianCutClustering.Hash(lab.L, min.L, max.L); px.B = MedianCutClustering.Hash(lab.A, min.A, max.A); px.C = MedianCutClustering.Hash(lab.B, min.B, max.B); } this.cubes = new List <ColorCube>(); this.cubes.Add(cube); }
public void Split(out ColorCube a, out ColorCube b) { a = null; b = null; int minA = 0; int minB = 0; int minC = 0; int maxA = 0; int maxB = 0; int maxC = 0; for (int i = 0; i < this.Pixels.Count; i++) { PixelInfo p = this.Pixels[i]; if (i == 0) { minA = maxA = p.A; minB = maxB = p.B; minC = maxC = p.C; continue; } minA = ColorCube.Min(p.A, minA); minB = ColorCube.Min(p.B, minB); minC = ColorCube.Min(p.C, minC); maxA = ColorCube.Max(p.A, maxA); maxB = ColorCube.Max(p.B, maxB); maxC = ColorCube.Max(p.C, maxC); } int A = maxA - minA; int B = maxB - minB; int C = maxC - minC; if ((A >= B) && (A >= C)) { this.Pixels.Sort(ColorCube.CompareA); } else if ((B >= A) && (B >= C)) { this.Pixels.Sort(ColorCube.CompareB); } else { this.Pixels.Sort(ColorCube.CompareC); } { int h = (this.Pixels.Count >> 1); int p = 0; a = new ColorCube(h); for (int i = 0; i < h; i++) { a.Pixels.Add(this.Pixels[p++]); } h = this.Pixels.Count - h; b = new ColorCube(h); for (int i = 0; i < h; i++) { b.Pixels.Add(this.Pixels[p++]); } } }