Здравствуйте, Scherhan, Вы писали:
S>Спасибо за отклик от Анонима, он же Scherhan
S>Программировать графику недавно начала...Вот и пытаюсь, сие гранит грызть. Пишу на Билдере. У меня снимки представлены в плоскости, т.е. в координатах X,Y. Первое, мне надо понять, как перевести координаты выделенного квадрата в матрицу???
S>Спасибо за внимание. Пока
Я не совсем понимаю — зачем переводить координаты выделенного квадрата в матрицу?
И каким образом снимки заданы на плоскости? Это массив? TBitmap? Или что?
Предположим, задан двумерный массив:
COLORREF img[Width][Height]; // можно и TColor вместо COLORREF
Width и Height — ширина и высота снимка соответственно
Верхний-левый угол снимка — точка img[0][0], поэтому, если координаты выделенного квадрата, допустим (10, 10) — (20, 20), то нам и нужны точки с img[10][10] по img[20][20]. В этом случае код обработки (масштабирования) этого фрагмента будет выглядеть примерно так:
// M - матрица масштабирования (см. предыдущий постинг)
// TVector - вектор (x, y), должна быть определена операция умножения матрицы на вектор
TVector tl(10, 10); // верхний левый
TVector br(20, 20); // нижний правый
tl *= M; br *= M;
int w = br.x - tl.x; h = br.y - tl.y; // размерность нового массива
COLORREF *buf = new COLORREF[w*h];
M *= T(-tl.x, -tl.y); // домножаем на матрицу сдвига, чтобы новый массив начинался с точки (0, 0)
TMatrix IM = Inverse(M); // обращаем матрицу - операция так же должна быть определена
for(int y=0; y<h; y++){
for(int x=0; x<w; x++){
TVector V(x, y); V *= IM; // получаем координаты точки результирующего изображения (x, y) в исходном
buf(w*y + x) = img[V.x][V.y];
}
}
нетрудно заметить, что в данном случае масштабирование работает несовсем корректно: при уменьшении масштаба, часть точек исходного изображения просто пропадёт, а при увеличении — на результирующем изображении будут "одинокие" пиксели в окружении "пустоты"...
Бороться с этой проблемой можно таким образом:
1)при увеличении масштаба заполнять все точки от (x, y) до (x + sx, y + sy) одним цветом, получая блочную структуру (то же самое делает стандартная WINAPI'шная ф-ция StretchDIBits())
2)Использовать различные алгоритмы фильтрации
Что конкретно использовать (и использовать ли вообще) зависит от конкретной задачи... Как предполагается в дальнейшем сравнивать снимки (фрагменты снимков)? Вобщем — это тема отдельного разговора
зы.
Настоятельно советую поискать на rsdn'е — похожие вопросы уже были, причём недавно... Приводились примеры и интересные ссылки по данной тематике
зы. 2
Я когда-то писал нечто подобное... Если интересно могу поискать