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); }