Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить, есть ли заданная точка в фигуре. 
:(
    Опции темы
donion
Дата 5.9.2010, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 18.12.2007
Где: Запорожье

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



Подскажите, как возможно реализовать такую задачу.

Есть рандомное количество точек с координатами, которые образуют собой фигуру.
Есть определенная точка с координатами.

Как определить находится ли заданная точка в фигуре?
Есть какой-нибудь отлаженный алгоритм? Может готовое что-нибудь встречали?   smile 
PM MAIL   Вверх
Muerto
Дата 5.9.2010, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Если картинка это квадрат который представляет собой закрытый набор пикселей то:
получаем координаты всех пикселей
смотрим если по x оси есть другие пиксели кроме нашей точки
и смотрим по y

если по x и y нифига нету то однозначно нашу точку никакая закрытая фигура не окружает

Главное смотреть как бы что есть точка снизу и сверху и справа и слева


У меня воображения не хватает представить закрытую фигуру которая не будет "резаться" таким методом

Если фигура замкнутая, обязательно и по x и по Y справа слева снизу сверху наш выстрел попадет


--------------------
user posted image
PM MAIL   Вверх
Skevalt
Дата 5.9.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно использовать алгоритм построения выпуклой оболочки, чтобы найти ломаную линию, которая образует покрывающую фигуру. Затем, представив каждый отрезок этой ломаной линии как вектор, и найти положение точки относительно каждого из таких векторов. Если точка будет "левее" всех векторов, то она гарантированно внутри выпуклой оболочки. Для каждого из этих действий существуют отлаженные библиотеки, нужно поискать на той же википедии.
PM MAIL   Вверх
Muerto
Дата 5.9.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Автор так и не сказал если фигура таки закрытая или нет... потому что если она не закрытая я не представляю как такое возможно рповерить и что есть окружает или нет


--------------------
user posted image
PM MAIL   Вверх
donion
Дата 5.9.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 18.12.2007
Где: Запорожье

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



Skevalt, спасибо, почитаю.

Muerto, фигура закрытая, но может быть сложная. К примеру может быть и 150, и 200 точек. 
Задача у меня изначально такая: курьер на гугл карте рисует фигуру, клиент ставит точку. Курьер может ошибиться и нарисовать к примеру вот такое:user posted image, но мне все равно нужно это определить - находится ли точка клиента в зоне курьера. 



PM MAIL   Вверх
Muerto
Дата 5.9.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну тогда мой метод как мне кажется будет самым простым...

Я такое никогда не делал и вообще я мало работаю с картинками, но все же php GD :

http://php.net/manual/en/book.image.php

Получаем картинку
Код

$im = imagecreatefromjpeg("my_image.jpg");

Далее смотрим на размер картинки
Код

list($width, $height) = getimagesize($im); 

Насколько я понимаю, верхний левый угол это (0,0) и когда мы идем вниз по x или y , мы увеличиваем параметры...
значит на самом деле
Код

list($max_x $max_y) = getimagesize($im); 

Точка у нас с координатами которые нам известны?
Тогда искать её не нужно...
Код

function peresikayet($dot_x,$dot_y){
$im = imagecreatefromjpeg("my_image.jpg");
list($max_x $max_y) = getimagesize($im); 
$flag=array('up'=>0,'down'=>0,'left'=>0,'right'=>0);

$figure_color='';//здесь цвет фигуры
for ($y=0;$y<=$max_y;$y++){

if(imagecolorat($im, $dot_x,$y)==$figure_color){
if($y>$dot_y){
$flag['down']=1;
}else{
$flag['up']=1;
}
}

}


for ($x=0;$x<=$max_x;$x++){

if(imagecolorat($im, $dot_y,$x)==$figure_color){
if($x>$dot_x){
$flag['right']=1;
}else{
$flag['left']=1;
}
}

}

под конец

return ($flag['down']!=0 && $flag['up']!=0 && $flag['left']!=0 && $flag['right']!=0)?1:0;

}


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


--------------------
user posted image
PM MAIL   Вверх
ksnk
Дата 5.9.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Muerto, забавная мысль - использовать gd для решения математических задач smile  только, imho, у нас есть список координат вершин и координата нужной точки. А картинки-то и нет. Зато ее можно нарисовать с помощью imagefilledpolygon и посмотреть цвет. Или можно нарисовать все грани фигуры, сделать imagefill из требуемой точки и посмотреть на цвет точки, гарантированно не принадлежащий фигуре. Если она покрасилась - исходная точка вне фигуры. Второй способ убережет нас от явной ошибки курьера с "перекрученными" вершинами.

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



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


Эксперт
***


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

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



ksnk, Респэкт, к сожалению не достаточно имею опыт работы с GD что бы додуматься до твоего решения...

В общем гениально... красим фигуру, и затем смотрим если наша точка сменила цвет =-)

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



--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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