Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм по определению пересечения линий 
V
    Опции темы
Ground
Дата 21.3.2009, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



Цитата(W4FhLF @  21.3.2009,  14:26 Найти цитируемый пост)
Если только под ломаной, то достаточно проверить все значения ординат промежуточных точек. Если они меньше, чем значения ординат на концах отрезка, то фигура не пересекает кривую.

Я немного не понимаю вас. Вот смотрите:
user posted image
У нас 9 точек. Мы в данном случае проверяем 1 и 9 точки. Их ординаты 2 и 3 соответственно. Я понимаю ваш алгоритм так: если ординаты всех промежуточных точек меньше 2, то кривая обязательно пересечет линию. Аналогично, если ордината всех промежуточных точек больше 3, то кривая абсолютно точно не пересечет линию. Тут все верно, но у нас остаются неописанные алгоритмом области - справа внизу под красной линией, и слева вверху. Если точка попадает в эти треугольнички, алгоритм не будет знать как поступить.

Это сообщение отредактировал(а) Ground - 21.3.2009, 08:28
PM MAIL ICQ   Вверх
W4FhLF
Дата 21.3.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Цитата(Ground @  21.3.2009,  08:25 Найти цитируемый пост)
Тут все верно, но у нас остаются неописанные алгоритмом области - справа внизу под красной линией, и слева вверху. Если точка попадает в эти треугольнички, алгоритм не будет знать как поступить.


Не понял. Можете показать на графике?

Добавлено через 9 минут и 54 секунды
Цитата(Ground @  21.3.2009,  08:25 Найти цитируемый пост)
Я понимаю ваш алгоритм так: если ординаты всех промежуточных точек меньше 2, то кривая обязательно пересечет линию. Аналогично, если ордината всех промежуточных точек больше 3, то кривая абсолютно точно не пересечет линию.


Если ордината хотя бы одной точки <= 2, то отрезок пересечёт кривую.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ground
Дата 21.3.2009, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



user posted image
Синяя область описывается алгоритмом однозначно. А вот что делать при попадении точки в оранжевую или желтую часть, алгоритм не знает.

user posted image
Вот тут точка 3 как раз попадает в эту область.
PM MAIL ICQ   Вверх
W4FhLF
Дата 21.3.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Но эт не работает. smile  Ибо если ордината 7ой точки будет 2.5, то отрезок всё равно пересечёт кривую.

Добавлено через 1 минуту и 56 секунд
Да, я уже понял. Хм. 

Тогда можно поступить так. Брать абсциссу промежуточной точки, вычислять в ней ординату отрезка (уравнение прямой простое, будет работать быстро) и сравнивать с ординатой точки.

Добавлено через 3 минуты и 55 секунд
Причём надо вычислять только для синей/жёлтой областей. Т.е. сначала проверка в какую область попадает точка, если в синюю/жёлтую, то вычислять ординату отрезка в этой точке и сравнивать с ординатой текущей промежуточной точке. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ground
Дата 21.3.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



Цитата(W4FhLF @  21.3.2009,  15:57 Найти цитируемый пост)
Брать абсциссу промежуточной точки, вычислять в ней ординату отрезка (уравнение прямой простое, будет работать быстро) и сравнивать с ординатой точки.

Тогда получается нужно брать коориднаты точек, через которые провели линию, получать из них коэффициенты A, B и C для уравнения прямой Ах+Ву+С=0. И потом подставлять абциссу в уравнение y=-(Ax+C)/B. После сравнивать 2 ординаты. И еще надо делать проверку на деление на 0.
Ну такой алгоритм намного проще, чем находить пересечение линий smile
Но все равно, при 10к точек получается 50млн различных вариантов проведения линии. С таким колчиеством не уложиться даже в минуту работы программы.
Должно быть что-то еще, какой то неучтенный момент, который заметно упростит программу.

Хотя сначала лучше напишу, проверю скорость выполнения.


PM MAIL ICQ   Вверх
W4FhLF
Дата 21.3.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Цитата(Ground @  21.3.2009,  09:24 Найти цитируемый пост)
Тогда получается нужно брать коориднаты точек, через которые провели линию, получать из них коэффициенты A, B и C для уравнения прямой Ах+Ву+С=0. И потом подставлять абциссу в уравнение y=-(Ax+C)/B. После сравнивать 2 ординаты. И еще надо делать проверку на деление на 0.


Неверно. Уравнение прямой проведённой через две точки выглядит следующим образом: 

user posted image

Цитата

Но все равно, при 10к точек получается 50млн различных вариантов проведения линии. С таким колчиеством не уложиться даже в минуту работы программы.
Должно быть что-то еще, какой то неучтенный момент, который заметно упростит программу.


Я же говорю, что тебе нужно проверять сначала в какую область попадает точка. Этим ты снизишь количество необходимых уравнений для решения. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ksnk
Дата 21.3.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



W4FhLF, Вид уравнения не совсем удобен для такой задачи
Вот в таком виде y=A*x+B для всех таких прямых, проходящих через  точку (x1,y1) угол наклона такой прямой будет монотонной функцией от A. Так что экстремальные значения углов будут приходится на экстремальные значения А, тригонометрия становится не нужна.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
W4FhLF
Дата 21.3.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



ksnk, да вообще он приводится к виду:

y = (x - x1) * (y2 - y1) / (x2 - x1) + y1

Dыражение (y2 - y1) / (x2 - x1) находится один раз и получается в итоге(обозначив это выражение как a):

y = (x - x1) * a + y1

Раскрываем скобки:

x*a - x1*a + y1

Обозначаем -x1*a + y1 как b и получаем:

y = x*a + b

Ничего не напоминает?smile 


Это сообщение отредактировал(а) W4FhLF - 21.3.2009, 17:04


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ground
Дата 22.3.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



Всем спасибо за помощь!
Алгоритм, предложенный W4FhLF очень хорошо себя показал.

Это сообщение отредактировал(а) Ground - 22.3.2009, 13:31
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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