Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Видимость дороги в профиле, быстрый расчет видимости дороги в профил 
:(
    Опции темы
Breed
Дата 18.4.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кто-нибудь знает алгоритм расчета видимости трассы в профиле? 
Очень желательно, чтобы работал быстро(в идеале - линейно).

Суть задачи...

Есть набор Z-отметок высот трассы. 
Необходимо найти в каждой точке максимальное расстояние видимости вдоль трассы.
 
PM MAIL   Вверх
nostromo
Дата 18.4.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



(Предполагаю что трасса конечная, если не так, то несложно доработать.)

1. Строим выпуклую оболочку отметок высот (сложность ~n log[2](n), строится через сортировку). Получаем точки B[1], ... B[k].
2. Последовательно, начиная с ближайших, проводим прямые от наблюдателя A к точкам B[i]. Последняя точка B[s], для которой все предыдущие B[i] лежат ниже прямой (A; B[s]) и есть самая дальняя видимая точка. 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Breed
Дата 18.4.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хммм... Кажется не совсем так...
Во первых я не совсем корректно сформулировал задачу. Видимой из точки А считается точка Б,
если из точки А+1.2м (в высоту) видно точку Б+0.2м (в высоту). Это первая проблема...
Второе, предложенный алгоритм кажется не работает... Напимер:
А1 - (0,0) А2 - (2, 10) А3 - (4, 0) А4 - (6, -20) А5 - (8, 0) А6 - (10, 10).
Для этих 6ти точек, например, по алгоритму из А2 будет видно А4, а на самом деле - нет...

Или я что-то недопонял?  smile  
PM MAIL   Вверх
maxim1000
Дата 18.4.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



тут, ИМХО, на углы надо смотреть
начать с ближайшей точки и двигаться вперед, пока не получим невидимую точку
а невидимость - когда угол на какую-нибудь из предыдущих больше, чем на проверяемую (+0.2)
для каждой точки определение видимости занимает линейное время
для всех - квадратичное
оптимизации пока в голову не приходит
P.S.
конечно же, для реализации сравнение углов стоит заменить на сравнение их тангенсов - их проще вычислить... 


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


Бывалый
*


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

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



Уточнения.
1. При построении выпуклой оболочки, область под профилем считается внутренней.
2. Пусть нас интересует видимость вправо, тогда при построении 
выпуклой оболочки все отметки слева от наблюдателя не рассматриваем.
3. Выпуклую оболочку нужно проводить через "поднятые" (+0,2м) точки. 
4. Положение наблюдателя вообще не важно, лишь бы не ниже профиля.

В Вашем примере выпуклая оболочка будет проходить только через точки А2 и А6, поэтому первой и последней перебираемой точкой будет А6. Она же и есть последняя видимая точка.

Добавлено @ 12:02 
maxim1000, Вы не правы. Требуется найти не максимальную область видимости, а максимальное расстояние видимости, т.е. какие-то точки до последней видимой могут оказаться невидны. 

Это сообщение отредактировал(а) nostromo - 18.4.2006, 11:57
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Breed
Дата 18.4.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Полагаю, все точки, не попадающие на выпуклую оболочку, до последней видимой, считаются видимыми, но в примере так не выходит - из А2 не видно А4. Для наглядности можно опустить А4 еще на 100, будет такая яма, которую с А2 не видно(А3 заслоняет). Хотя она вып. об. не принадлежит, и посему по алгоритму выходит видимой.

Добавлено @ 12:08 
Цитата(nostromo @  18.4.2006,  11:56 Найти цитируемый пост)
Добавлено @ 12:02 
maxim1000, Вы не правы. Требуется найти не максимальную область видимости, а максимальное расстояние видимости, т.е. какие-то точки до последней видимой могут оказаться невидны. 


:-) как раз наоборот... именно область мне и нужна.

Добавлено @ 12:10 
Цитата(maxim1000 @  18.4.2006,  11:45 Найти цитируемый пост)
для всех - квадратичное

Именно это и огорчает...  smile  
PM MAIL   Вверх
nostromo
Дата 18.4.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тогда я неправильно понял задачу и Вам следует воспользоваться предложением maxim1000.

 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
nostromo
Дата 18.4.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно модифицировать алгоритм maxim1000 и получить линейную сложность. 
Дело в том, что на каждом шаге нужно проверять не все предыдущие, а только
предпоследнюю (одну предыдущую).

Добавлено @ 12:32 
Доказательство: Если из А  были видны B[1], ..., B[i], а B[i+1] не видна, то B[i] обязана ее закрывать. Это следует из того, что с ростом i угол HAB[i] монотонно возрастает, где H --- любая фиксированная точка, такая, что для всех B[i] указанный угол меньше развернутого. 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 18.4.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



Цитата(nostromo @  18.4.2006,  11:26 Найти цитируемый пост)
Доказательство: Если из А  были видны B[1], ..., B[i], а B[i+1] не видна, то B[i] обязана ее закрывать. Это следует из того, что с ростом i угол HAB[i] монотонно возрастает, где H --- любая фиксированная точка, такая, что для всех B[i] указанный угол меньше развернутого.

тут вся фишка в том, от кого закрывать...
представим себе впадину между двумя возвышенностями
если внизу будет холмик небольшой, то он будет закрывать часть дороги вверх для нижних точек, но не для верхних
т.е. сиз начала дороги (на возвышенности) будет видно весь участок
когда мы будет потихоньку спускаться в один прекрасный момент маленький холмик начнет перекрывать то, что за ним
и снова тот участок мы увидим только, когда на него заберемся...
пример в точках:
(0,10)-(1,5)-(2,0)-(3,0)-(4,1)(холмик)-(5,0)-(6,0)-(7,5)-(8,10)

но все это неважно, т.к. есть еще одно условие, которое убивает немало путей для рассуждений (возожно, не все): те самые 1.2 и 0.2 метра
когда точка проверяется на видимость, у нее одна высота (+0.2)
когда она проверяется на "мешание" видимости другой у нее другая (без всяких добавок)
и когда проверяется видимость из нее, у нее вообще третья высота (+1.2)
из этого, например, следует, что любая кривая с перепадом высот не более, например 0.01м будет видна вся 


--------------------
qqq
PM WWW   Вверх
Breed
Дата 18.4.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nostromo @  18.4.2006,  12:26 Найти цитируемый пост)
Добавлено @ 12:32 
Доказательство: Если из А  были видны B[1], ..., B[i], а B[i+1] не видна, то B[i] обязана ее закрывать. Это следует из того, что с ростом i угол HAB[i] монотонно возрастает, где H --- любая фиксированная точка, такая, что для всех B[i] указанный угол меньше развернутого.  


Насколько я понял, Вы предлагаете следующее: Если имеет место видимость А-В[i], и не имеет место А-В[i+1], то для точки А+1(следующей после А) можно проверять видимость сразу до точки B[i]. и не надо проверять видимость для точек [2..i-1] 
Если эта видимость есть для В[i], то она есть и для предыдущих... 

Так?

Но если ее нет, то получается, что нужно все равно проверять все точки начиная со следующей после наблюдателя...

Так алгоритм все равно не линейный, хотя улучшение налицо... :-)
 
PM MAIL   Вверх
nostromo
Дата 18.4.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



To Breed.
Алгоритм соевршенно линейный, проверяем последовательно точки, начиная от наблюдателя, пока не найдем точку, которая конфликтует с предыдущей. 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Breed
Дата 18.4.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nostromo @  18.4.2006,  13:58 Найти цитируемый пост)
To Breed.
Алгоритм соевршенно линейный, проверяем последовательно точки, начиная от наблюдателя, пока не найдем точку, которая конфликтует с предыдущей.  



Линейный для одной точки. А для каждой - соответственно квадрат. 
PM MAIL   Вверх
nostromo
Дата 18.4.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Линейный для одной точки. А для каждой - соответственно квадрат. 


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

Добавлено @ 14:35 
maxim1000
Цитата

тут вся фишка в том, от кого закрывать...
представим себе впадину между двумя возвышенностями
если внизу будет холмик небольшой, то он будет закрывать часть дороги вверх для нижних точек, но не для верхних
т.е. сиз начала дороги (на возвышенности) будет видно весь участок
когда мы будет потихоньку спускаться в один прекрасный момент маленький холмик начнет перекрывать то, что за ним
и снова тот участок мы увидим только, когда на него заберемся...
пример в точках:
(0,10)-(1,5)-(2,0)-(3,0)-(4,1)(холмик)-(5,0)-(6,0)-(7,5)-(8,10)


На картинке отмеченные углы последовательно возрастают, а вот для следующей точки соответствующий угол будет меньше предыдущего. Где проблема? 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  q1.png 9,25 Kb
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
nostromo
Дата 18.4.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Видимость через добавочные 0,2 м --- это действительно особенность. Для ее учета предлагаю сначала найти максимальную область видимости отметок высот (без учета добавки к высоте), а затем попытаться ее расширить за счет этого смягчающего обстоятельства. 
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 18.4.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 110



Цитата(nostromo @  18.4.2006,  13:23 Найти цитируемый пост)
На картинке отмеченные углы последовательно возрастают, а вот для следующей точки соответствующий угол будет меньше предыдущего. Где проблема?

проблема в том, что с точки 1 вообще все видно, значит, последняя точка 8
а когда мы спускаемся в точку 2, недостаточно проверить точку 9 (если бы такая была)
чтобы понять, что видимость из точки 2 будет именно до точки 4 нужно пройтись между точками 2 и 8, чтобы найти этот холмик или понять, что его нету
если проверять только точки, соседние с 8, то холмик, который находится значительно раньше, поймать не получится... 


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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