![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
Как из вот этого:
![]() получить вот это: ![]() То есть, имеется прямоугольная картинка, ее координаты известны и легко получаются координаты каждой точки. Также известны координаты трапеции, к которой надо привести исходный прямоугольник. Собственно, вопрос. Как сопоставить координаты точек трапеции координатам точек прямоугольника? Ведь координаты внутренней точки трапеции зависят от координат каждого из четырех ее углов... |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]()
См. "проективные преобразования".
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
Ага, значит только через векторы. И использовать принцип подобия из программы 7-го класса не катит.
То есть сначала вычислять угол поворота и масштабирование плоскости, от этого получать координаты единичных векторов осей, потом через операции с векторами получить координаты точки на повернутой плоскости, отбрасываем ось Z и получаем координаты проекции, потом создать матрицу соответствия координат точек трапеции точкам прямоугольника и уже через эту матрицу отрисовывать картинку на экране (чтобы не просчитывать каждую точку снова и опять при каждом WM_PAINT). // Ну, в псевдокоде все очевидно) UPD: Или же векторы тут не при чем, а через сопоставление координат трапеции координатам прямоугольника получаем [3x3] матрицу "подобия", применив которую к точке исходной фигуры получим точку результирующей? Последний раз редактировалось Smogg; 28.12.2012 в 22:56. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]()
В интернете нашлась вот такая статья. Вроде неплохо описано.
Я могу изложить альтернативный подход, "художественный": пусть прямоугольник ABCD переходит в A'B'C'D'. Возьмём точки пересечения A'B' с C'D' (P) и A'D' с B'C' (Q). Линия PQ - это "горизонт": любое семейство параллельных прямых прообраза сходится в некоторую точку на нём (либо параллельно ему). С помощью этого правила легко перевести в образ любую точку, лежащую на пересечении пары выстраиваемых прямых. |
![]() |
![]() |
![]() |
#5 | |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]() Цитата:
А с другой стороны... Если взять за опорные точки пучков два смежных угла, то центр картинки просчитывается наверняка, а вот с краем, принадлежащем опорным точкам, может получится может стать что-то не то. Хотя для моих целей вполне можно отбросить десяток крайних пикселей исходной картинки, она все равно на порядок больше, так даже реализма добавится. ...Хм, исходную картинку еще можно обрезать, но с результирующей останется тот же самый вопрос - пересечение практически параллельных прямых. Или расчет треугольника высотой в 1 пиксель и шириной в триста - ничего страшного? Да, скорее всего точности float'a на это хватит... Этот вариант сложен в реализации, зато прост в понимании. Отсюда вижу, какие хитрозакрученные циклы придется дебажить и придумывать проверки деления на почтиноль. С матрицами ровно наоборот - сложно понять, но легко реализовать. Исходя из всего этого, пойду медитировать матрицы по ссылке, как более общий и универсальный принцип преобразований. Пасиб) UPD: Да, но ведь можно использовать все четыре угла как опорные точки пучков линий. Тогда одна половина трапеции рассчитывается от одной пары углов, а вторая от второй. Таким образом решается вопрос с краевой неопределенностью и можно обойтись знаниями геометрии на уровне 7-го класса вместе с банальной пропорциональностью. Вопрос решен. Последний раз редактировалось Smogg; 29.12.2012 в 02:40. |
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
И правда...
![]() Магия какая-то. Пропорции нету, а прямые остаются прямыми: ![]() Думал, что хотя бы по краю сохраняется пропорция, а оказытца, что ни по краю ни где вообще пропорциональность не гарантирована. Ладно, пошел читать DirectX ) |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
обработка изображения преобразование Фурье | Ria Alva | C++ Builder | 0 | 06.06.2012 21:43 |
C++ Builder обработка изображения преобразование Фурье | Ria Alva | Помощь студентам | 0 | 05.06.2012 20:31 |
обработка и преобразование изображения | midiss | C++ Builder | 0 | 04.06.2012 14:52 |
Геометрическое распределение | papoose | Помощь студентам | 0 | 21.05.2011 20:43 |
Среднее геометрическое | SkuLLL | Помощь студентам | 1 | 12.12.2010 17:10 |