Re[3]: Как перевести координаты выделенного квадрата в матри
От: GarikTot  
Дата: 17.11.02 23:06
Оценка:
Здравствуйте, 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
Я когда-то писал нечто подобное... Если интересно могу поискать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.