/* ColorGenerator.cpp Written by Matthew Fisher */ void ColorGenerator::Generate(Vector &Result) { Generate(Result, Vec3f(1.0f, 1.0f, 1.0f)); } void ColorGenerator::Generate(Vector &Result, const Vec3f &Scale) { const UINT ColorCount = Result.Length(); KMeansClustering Clustering; Vector AllColors(ColorCount * 25); const UINT AllColorsCount = AllColors.Length(); for(UINT Index = 0; Index < AllColorsCount; Index++) { Vec3f CurColor = Vec3f(rnd(), rnd(), rnd()); while(CurColor.x + CurColor.y + CurColor.z < 0.5f) { CurColor = Vec3f(rnd(), rnd(), rnd()); } AllColors[Index] = Vec3f(CurColor.x * Scale.x, CurColor.y * Scale.y, CurColor.z * Scale.z); } Clustering.Cluster(AllColors, ColorCount, 20, false); for(UINT ColorIndex = 0; ColorIndex < ColorCount; ColorIndex++) { Result[ColorIndex] = RGBColor(Clustering.ClusterCenter(ColorIndex)); } }