Смысл этой задачи состоит в том, что есть некоторая палитра цветов -
нумерованный список цветов, состоящих из троек RGB, и есть некоторый
отдельно заданный цвет со значениями RGB, не входящими в эту палитру.
Нужно найти цвет из заданной палитры, наиболее близкий по окраске к
заданному. Решение задачи состоит в том, что нужно рассмотреть цветовой
куб RGB и найти в нем наименьшее расстояние до заданной точки, которое,
как известно, определяется суммой квадратов по каждой из координат.
Решение написано немного коряво, но я старался использовать самые-самые
понятные и простые конструкции, избегая преимуществ STL, указателей и т.п.
/*///////////////////////////////////////////////////////////////
RGB Search, GNU C++, 2011-01-15
Artix, master@7masterov.ru, icq:53666599, skype:artixmaster
* Error in code? Nothing is perfect!
* Free source for free Linux, use it for free!
* Please, do not remove this comment!
///////////////////////////////////////////////////////////////*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
class Color
{
private:
int R,G,B;
public:
Color();
void show();
double distance(Color x);
};
Color::Color()
{
R = rand() % 256;
G = rand() % 256;
B = rand() % 256;
}
void Color::show()
{
printf("(%d,%d,%d)\n",R,G,B);
}
double Color::distance(Color x)
{
return sqrt( (R-x.R)*(R-x.R)+(G-x.G)*(G-x.G)+(B-x.B)*(B-x.B) );
}
const int N = 10;
int main()
{
srand(time(NULL));
// Palette
Color list[N];
// Search color
Color search;
for(int i=0;i<N;i++)
{
printf("%d: ",i);
list[i].show();
}
printf("\n");
search.show();
// Search nearest color number
int n=-1;
double d;
double min_d = list[0].distance(search);
for(int i=0; i<N; i++)
{
d=list[i].distance(search);
if (d<min_d)
{
min_d=d; n=i;
}
}
printf("Nearest color: %d\n",n);
return 0;
}
Справочник алгоритмов v0.05 © 2007-2025 Igor Salnikov aka SunDoctor