Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Точка в фигуре 
:(
    Опции темы
vasisualiiL
Дата 25.10.2006, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня на форме нарисованна фигура из множества точек. Когда я кликаю мышкой, как мне определить
попал я внутрь фигруы или нет? Подскажите пожалуйста... smile 
PM MAIL   Вверх
Romikgy
Дата 25.10.2006, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



а что за фигура?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 25.10.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Для этого можно воспользоваться возможностями винды.
1) Создается регион, например полигональный (по точкам периметра) или из квадратов (сканируя по строкам) 
Функции CreatePolygonRgnCreatePolyPolygonRgnCreateRectRgnCombineRgn
2) Проверяем попадание в заданный регион точки PtInRegion 

Более подробно о этих функциях можно узнать в MSDN в разделе "Region Functions" (Windows GDI)

Добавлено @ 09:19 
У меня был где-то даже код создания такого региона по битмапу (задается цвет прозрачности и все что другого цвета становится регионом)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vasisualiiL
Дата 25.10.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Фигура может быть любой произвольной формы, и с любым количетсвом точек(узлов?), но тут задача по-моему усложнилась: не просто тыкнуть мышкой, а  и просто по координатам точки узнать входит ли она в заданную фигуру smile 
PM MAIL   Вверх
vasisualiiL
Дата 25.10.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



и еще хуже smile по-моему придется обойтись без winapi smile 
PM MAIL   Вверх
Alexeis
Дата 25.10.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(vasisualiiL @  25.10.2006,  10:11 Найти цитируемый пост)
по-моему придется обойтись без winapi 

Это как  smile  под Kylix?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vasisualiiL
Дата 25.10.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Угу и под него то же.

Добавлено @ 11:09 
А вообще с Kylix ещё вопрос, просто это надо решить по разным причинам без winapi smile 
PM MAIL   Вверх
Alexeis
Дата 25.10.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Тогда нужно заносить точки периметра каждого блока в матрицу
Например если картинка такая
--------------------------------------------------------------
|12345678901234567890123456789012345678|
|-------------------------------------------------------------|
|00000000000111111100000011111111100000|
|00000000011110001111110000001111111111|
|00000000000111111100000000111000000000|
---------------------------------------------------------------
например 
первая строка будет иметь значения (12,18)(25,33)
Вторая строка будет иметь значения (10, 13)(17,22)(29,38)
Третья строка будет иметь значения (12, 18)(27,29)
Если у нас точка скажем (1, 19), то мы выбираем первую строку и проверяем, попало ли значение 19 - в один из указанных диапазонов. В данном случае 19 > 18 > 12 и 19 < 25 < 33, т.е. не попало ни в один из диапазонов. Можно сделать свою структуру 
1) число диапазонов
2) второе динамический массив диапазонов.

Т.о. Получим для каждой строки по одной такой структуре. 



Это сообщение отредактировал(а) alexeis1 - 25.10.2006, 11:23


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rodman
Дата 25.10.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



Ну ты же ее по координатам формируешь (если она у тебя из точек состоит)

нельзя что ли обрабатывать OnMouseDown и по координатам сравнивать???
PM MAIL WWW Skype GTalk YIM MSN   Вверх
maxim1000
Дата 25.10.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



первый вопрос, без прояснения которого нормально и обсудить-то не получится:
как задана фигура?
1. используется ли информация с Canvas формы?
2. или есть какое-то внутреннее представление?
в первом случае GetPixel
во втором - зависит от способа задания фигуры


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


Новичок



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

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



Наверное плохо объяснил ( ну бывает smile ) есть массив с коррдинатами точек, по этому массиву отрисовывем (или не отрисовываем) фигуру, и есть некакя точка с координатами (х,у) не важно как полученная, кликом ли мышкой или через переменную, и необходимо определить попадает ли эта точка в контур. Фигура может бать самой призвольной формы и слюбым количеством вершин (ух писать устал smile ) smile

Добавлено @ 12:01 
Цитата(alexeis1 @  25.10.2006,  11:21 Найти цитируемый пост)
Тогда нужно заносить точки периметра каждого блока в матрицу
Например если картинка такая
 и т.д.

К своему стыду ничего не понял smile  smile 

PM MAIL   Вверх
Alexeis
Дата 25.10.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



vasisualiiL, Фигура односвязная или многосвязная (целая или из кусков)? Есть ли пустоты?

Добавлено @ 12:08 
Цитата(vasisualiiL @  25.10.2006,  11:59 Найти цитируемый пост)
К своему стыду ничего не понял

Такое представление удобно если картинка задана битмапом. Единицы - это то что внутри области нули все что снаружи. Один диапазон это фрагмент (часть строки) состоящий из одних только единиц. Задается он по Х координате (начало, конец) по Y координате определяется номер строки.
Таким образом если начало<X<конец - то точка внутри фигуры иначе она либо в другом диапазоне этой же строки или вне фигуры.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vasisualiiL
Дата 25.10.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Фигура целая, просто замкнутый контур.
готов выложить маленький рисунок, но не знаю как... smile 
PM MAIL   Вверх
Rodman
Дата 25.10.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



Когда пишешь сообщение внизу можно прикрепить файл... так и кинь
PM MAIL WWW Skype GTalk YIM MSN   Вверх
vasisualiiL
Дата 25.10.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот примерно так smile 
Маленько грубовато... но принцип понятен

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  primer.jpg 3,64 Kb
PM MAIL   Вверх
maxim1000
Дата 25.10.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



если фигура задана последовательностью точек контура, то есть простой способ: проводим луч в любом направлении (удобно в горизонтальном или вертикальном) и считаем, сколько раз он пересечёт контур
если чётное количество раз - точка за пределами фигуры, иначе - внутри


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


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



Твоя фигура описывается по формулам? Если да то просто проверяй вхождение х и у...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Alexeis
Дата 25.10.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



maxim1000, Это похоже на мой способ если линию проводить горизонтально. smile , только с возможностью векторной реализации. Точнее мой способ частный случай этого. Но вот векторная реализация не проста. Нужно искать пересечения с каждой их прямых образованных соседними точками и проверять, лежит ли точка пересечения между двумя исходными.
ИМХО такой способ медленнее, но экономит память.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rounin
Дата 25.10.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

function PtInPolygon(const P: array of TPointF; N: Integer; X, Y: TFloat): Boolean;
var
  i, j, k, Count, Intersect: Integer;
  t: TFloat;
        function MaxY(i, j: Integer; var k: Integer): TFloat;
        begin
          if P[i].Y > P[j].Y then
          begin Result := P[i].Y; k := i; end else
          begin Result := P[j].Y; k := j; end;
        end;

        function MinY(i, j: Integer; var k: Integer): TFloat;
        begin
          if P[i].Y > P[j].Y then
          begin Result := P[j].Y; k := j; end else
          begin Result := P[i].Y; k := i; end;
        end;
begin
  Count := N;
  Intersect := 0;
  for i := 0 to Count - 1 do
  begin
    j := (i+1)mod Count;
    if not(    ( Y<P[i].Y )and( Y<P[j].Y )   )and
       not(    ( Y>P[i].Y )and( Y>P[j].Y )   )and
       not(    P[i].Y =  P[j].Y              )then
         if MaxY(i, j, k) = Y then
         begin
           if P[k].X > X then Inc(Intersect)
         end
         else
         if not (MinY(i, j, k) = Y) then
         begin
           t := (Y - P[i].Y )/( P[j].Y - P[i].Y );
           if (t>0)and(t<1)and(P[i].X+t*(P[j].X-P[i].X)>X)then Inc(Intersect);
         end;
  end;
  Result := Intersect mod 2 = 1;
end;




Это сообщение отредактировал(а) rounin - 26.10.2006, 13:21
PM MAIL   Вверх
Bitter
Дата 26.10.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



А я тут вот какой алгоритм придумал (правда он сложноват, но зато подходит и для 3D случая):

Для того, чтобы определить находится ли точка внутри выпуклого(!) многоугольника, необходимо вычислить углы между нормалью i-й грани и вектором от точки до середины i-й грани. Если все углы больше 90 градусов, значит точка лежит внутри многоугольника.

Чтобы определить лежит ли точка внутри произвольного многоугольника, необходимо сначала разбить его на треугольники (треугольник - выпуклая фигура). Если точка лежит в одном из треугольников - она попадает в область всей фигуры.

В 3D случае объект нужно разбивать на пирамиды.
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


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

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


 




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


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

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