Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.01.2016, 12:18
paxom22848 paxom22848 вне форума
Прохожий
 
Регистрация: 06.01.2016
Сообщения: 2
Версия Delphi: 7
Репутация: 10
Восклицание Сгенерировать случайную точку, принадлежащую многоугольнику

Задание: сгенерировать случайную точку, которая бы лежала внутри многоугольника с заданными координатами (Xi,Yi).
Самое грубое, по-моему мнению, решение - кинуть случайную точку на всю область, проверить принадлежит ли эта точка многоугольнику, если да - задание решено, если нет - кидаем еще одну точку и так в цикле.
Но это уж очень неоптимальный и ресурсоемкий способ.
Подскажите, есть ли более интеллектуальные методы для решения подобного рода задач?
Ответить с цитированием
  #2  
Старый 06.01.2016, 18:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

А в общем случае да, надо генерить точку и проверять ее на принадлежность многоугольнику. Т.О. получится лучшее покрытие по площади. Единственное, можно ограничить координаты генерации от Xmin до Xmax и Ymin до Ymax.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
paxom22848 (07.01.2016)
  #3  
Старый 07.01.2016, 05:57
paxom22848 paxom22848 вне форума
Прохожий
 
Регистрация: 06.01.2016
Сообщения: 2
Версия Delphi: 7
Репутация: 10
По умолчанию

Ага, спасибо. Все-таки придется генерировать точку на всей области (конечно, ограниченной XYmin,max) и проверять на принадлежность.
Способ с окружностью хорош, но у меня такой случай, когда многоугольники могут состоять из нескольких сотен точек, а их форма будет очень неадекватна.
Ответить с цитированием
  #4  
Старый 07.01.2016, 16:14
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Just for lulz.
Ну, если принципиально не хочется генерировать рандомные точки наугад, можно попробовать еще такую наркоманию.
1) Генерируем рандомную точку в пределах описывающего квадрата Xmax, Ymax.
2) Если эта точка в многоугольнике - задача решена.
3) Иначе, берем фиксированную точку, 100% находящуюся внутри многоугольника, желательно как можно дальше от всех сторон. Можно определить ее заранее один раз.
4) Проводим прямую из фиксированной точки в рандомную и находим точки пересечения со сторонами многоугольника. Находим расстояние от нашей рандомной точки до ближайшей точки пересечения (т.е. до "входа" в многоугольник, если двигаться по прямой через фиксированную точку) и до следующей за ней (т.е. до "выхода"). После этого генерируем рандомную точку в этом диапазоне.

Задача становится детерменированной - 2 вызова рандома и немного расчетов. Хотя я сам думаю, что это треш.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 07.01.2016 в 18:02.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
paxom22848 (09.01.2016)
  #5  
Старый 07.01.2016, 18:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Еще вариант.
Генерируем случайно номер вершины многоугольника.
Далее случайно генерируем точку внутри треугольника, образованного выбранной вершиной и соседними с ней. Хотя тут может возникать ошибка, если попадешь в вершину, которая является впадиной, т.е. надо еще проверить эти соседние вершины - куда "смотрит" этот треугольник.

Короче, эвристик можно придумать много.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
paxom22848 (09.01.2016)
  #6  
Старый 07.01.2016, 18:30
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

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

А еще, например, в случае правильного 5-угольника, при таком методе сгенерированная точка никогда не попадет в крупную область в центре. И это не частный случай - таких фигур очень много.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 07.01.2016 в 20:30.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
paxom22848 (09.01.2016)
  #7  
Старый 08.01.2016, 19:00
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Не е*ите мзги, товарищи.
http://314159.ru/belov/Yr_myg.htm
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
paxom22848 (09.01.2016)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter