Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Система координат определяемая четырехугольником, четырехугольник с произвольными углами 
V
    Опции темы
_Y_
Дата 13.5.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Имеется четырехугольник с произвольными непрямыми углами. Координаты вершин известны. Нужена формула, позволяющая преобразовать систему координат так, чтобы в новой системе этот четырехугольник превратился в прямоугольник со сторонами параллельными осям.
user posted image

Конечная задача – найти положение точки на плоскости, используя координатную систему, определяемую этим прямоугольником.

По моим соображениям, это стандартная задача исправления перспективы на фотографиях. Но попытки что-то нагуглить выдают кучу красивых фоток, софт для выполнения работы и ни одного связного математического описания.

Спасибо



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Akina
Дата 13.5.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(_Y_ @  13.5.2009,  18:13 Найти цитируемый пост)
Координаты вершин известны.

Если я правильно понимаю - в реальном, неискажённом, пространстве.
Цитата(_Y_ @  13.5.2009,  18:13 Найти цитируемый пост)
Конечная задача – найти положение точки на плоскости, используя координатную систему, определяемую этим прямоугольником.

Итеративно методом половинного деления - устроит? 

Это сообщение отредактировал(а) Akina - 13.5.2009, 17:50


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
_Y_
Дата 13.5.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Akina @ 13.5.2009,  17:49)
Цитата(_Y_ @  13.5.2009,  18:13 Найти цитируемый пост)
Координаты вершин известны.

Если я правильно понимаю - в реальном, неискажённом, пространстве.

Именно так.

Цитата(Akina @ 13.5.2009,  17:49)
Цитата(_Y_ @  13.5.2009,  18:13 Найти цитируемый пост)
Конечная задача – найти положение точки на плоскости, используя координатную систему, определяемую этим прямоугольником.

Итеративно методом половинного деления - устроит?

Я тоже сначала так подумал. Типа старого анекдота "как поймать льва в пустыне" - забор при этом строить деля противоположные стороны пропорционально. Но потом думаю - что за радость процессор загружать - неужели нельзя напрямую решить? Вот и задал сюда вопрос.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Akina
Дата 13.5.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(_Y_ @  13.5.2009,  23:39 Найти цитируемый пост)
Но потом думаю - что за радость процессор загружать

10 итераций по каждой координате - точность в 0,1% тебя устроит? - вряд ли перегреет процессор.

Цитата(_Y_ @  13.5.2009,  23:39 Найти цитируемый пост)
неужели нельзя напрямую решить?

Конечно, задача вполне решается аналитически. Прямые противолежащих сторон в искажении пересекаются - а на самом деле параллельны... следовательно любая прямая, проходящая через кажущуюся точку пересечения противолежащих сторон в реале параллельна им... точно так же точка пересечения диагоналей на проекции остаётся ею и в реале... можно погрузиться в дебри тригонометри, только имхо два десятка итераций на исключительно + - * / куда как менее вычислительно затратны, пусть и дают приближённый результат... а если много тебе ошибки один промилле, ну сделай по 20 итераций по каждой координате, тогда уж точно можно остановиться, потому как погрешность вычислений станет сравнима с точностью результата.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
_Y_
Дата 14.5.2009, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Akina @ 13.5.2009,  23:17)
10 итераций по каждой координате - точность в 0,1% тебя устроит? - вряд ли перегреет процессор.

Умеешь ты уговаривать smile  Если не лень - напиши свою версию алгоритма, пожалуйста.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Akina
Дата 14.5.2009, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



рис. 1 - исходное состояние. 
A, B, C, D - вершины прямоугольника
X - заданная точка
O1, O2 - кажущиеся точки пересечения сторон

Присоединённый файл ( Кол-во скачиваний: 31 )
Присоединённый файл  x1.gif 2,29 Kb


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 14.5.2009, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



рис. 2 - первая итерация. 
Находим точку пересечения диагоналей прямоугольника.
Проводим прямые из кажущихся точек пересечения сторон, они делят (реальный) прямоугольник на 4 равных прямоугольника.
Определяем, в какой из частей находится искомая точка.
Пересчитываем координаты вершин.

В результате итерации координаты точки уже нужно искать в прямоугольнике A1 - B - C1 - D1, координаты новых вершин четырёхугольника cA1 = (cA + cB)/2 и аналогично для остальных трёх вершин.

И так далее - до достижения требуемой точности.

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  x2.gif 2,74 Kb


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
_Y_
Дата 14.5.2009, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Akina @ 14.5.2009,  08:05)
Определяем, в какой из частей находится искомая точка.

Вот здесь чуть подробнее, если можно. Как определять?


Я, честно говоря, думал примитивнее. Сначала брать две противоположные стороны, делить их пополам, проводить прямую. Смотреть с какой стороны от прямой моя точка. Потом делить половинки пополам, потом четвертинки. На рисунке первый шаг - синяя прямая, второй зеленая, третий малиновая.
user posted image
Остановиться когда точка отстоит от прямой не больше, чем на величину заданной ошибки.
Потом проделать то же самое с другой парой сторон.

Чем мой алгоритм хуже?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Akina
Дата 14.5.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(_Y_ @  14.5.2009,  09:47 Найти цитируемый пост)
брать две противоположные стороны, делить их пополам, проводить прямую. Смотреть с какой стороны от прямой моя точка. Потом делить половинки пополам, потом четвертинки. На рисунке первый шаг - синяя прямая, второй зеленая, третий малиновая.

Алгоритм ошибочен. Пополам на изображении - ни фига не пополам в реале (см. мой рис. 2). Именно для того, чтобы получить правильный пополам из реала, я ищу точку пересечения диагоналей.

Цитата(_Y_ @  14.5.2009,  09:47 Найти цитируемый пост)
Как определять?

А вот с этим я могу сказать только сакраментальное "В поиск, тыщу раз обсуждалось".

Кстати, никто тебе не запрещает сначала делить пополам по одной координате до требуемой точности, потом по другой - просто в точности потеряешь... или по первой, потом по второй, потом снова по первой... ведь определение четвертинки есть не что иное как определение половинки, а потом определение половинки от половинки.

Это сообщение отредактировал(а) Akina - 14.5.2009, 10:23


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Earnest
Дата 16.5.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Может, я чего-то не понимаю, уважаемые сэры. Растянуть четырехугольник в прямоугольник? Либо билинейное преобразование, либо проективное... Билинейное эквивалентно 2 афинным по 2 треугольникам и лучше себя ведет в некотором роде... Оба преобразования довольно просты. Там, конечно, не формула, а решение системы линейных уравнений, но тоже не бог весь что - всего 4...


--------------------
...
PM   Вверх
_Y_
Дата 17.5.2009, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Earnest, моя благодарность за подробности будет безгранична в пределах разумного.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Earnest
Дата 17.5.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Проективное преобразование:
       u = (A0 * x + A1 * y + A2) / (A6 * x + A7 * y + 1);
       v = (A3 * x + A4 * y + A5) / (A6 * x + A7 * y + 1);

Билинейное преобразование:
       u = A0 * x + A1 * y + A2 * x * y + A3;
       v = A4 * x + A5 * y + A6 * x * y + A7;

Подставляем координаты известных точек (4 угла) в обеих системах координат, получаем систему уравнений (их будет 8, я ошиблась, это в терминах точек 4, а скалярных - 8), решаем и находим коэффициенты. Для решения системы я использую метод Гаусса, для хорошо определенной системы вполне хватает, но дело хозяйское.



--------------------
...
PM   Вверх
_Y_
Дата 18.5.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Earnest, прошу прощения за слабость моей математической базы, но хочется уточнить правильно ли я понимаю: 

A0 ... A7 это коэффициенты, определяющие зависимость между двумя системами координат.
x и y координаты точки в одной системе координат
u и v координаты той же точки во второй системе координат

С методом Гаусса я вроде знакомился когда-то-очень-давно.



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Earnest
Дата 18.5.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Совершенно правильно.
У меня есть код на C++, вычисляющий эти коэффициенты по опорным точкам. Надо?


--------------------
...
PM   Вверх
_Y_
Дата 18.5.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Earnest @ 18.5.2009,  10:43)
У меня есть код на C++, вычисляющий эти коэффициенты по опорным точкам. Надо?

Спасибо. Даже и не знаю. Сильно сомневаюсь, что разберусь больше, чем в десятке-другом строчек С++ кода. Как-то не приходилось никогда работать с С++


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1128 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.