Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение обекта на TImage [D5, D6, WinXP]


DDDeN ©   (2005-10-19 05:42:00) 

Здравствуйте! Есть такой вопрос. На TImage определенного размера, нарисованы фигуры (прямоугольники под разным углом и линии). Все они рисуются на этом имадже через Canvas, данные о координатах берутся из текстового файла. Необходимо определить по какой из фигур кликнул пользователь.


DDDeN   (2005-10-20 04:05:00) [1]

Спасибо! Буду пробовать!


REA   (2005-10-19 16:06:00) [2]

[16]


WondeRu   (2005-10-19 15:59:00) [3]

а насчет того, что ставим точку и проводим луч в любую сторону: если есть 1 пересечение, то точка внутри, если их 0 или 2, значит снаружи


Leonid Troyanovsky   (2005-10-19 15:47:00) [4]


> DDDeN   (19.10.05 05:42)  

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


CreatePolygonRgn, PtInRegion, DeleteObject.

--
Regards, LVT.


LEk   (2005-10-19 13:54:00) [5]


> Порядок точек для определения уравнения прямой очень важен,
> поэтому делай так: считай сначала для x1, y1, x2, y2, затем
> x2, y2, x3, y3 и далее до x(n-1)y(n-1), xn, yn и xn, yn,
> x1, y1 (точки упорядочены по часовой стрелке).

Ещё  осталось упорядочить точки по часовой стрелке :)


LEk   (2005-10-19 13:54:00) [6]


> Порядок точек для определения уравнения прямой очень важен,
> поэтому делай так: считай сначала для x1, y1, x2, y2, затем
> x2, y2, x3, y3 и далее до x(n-1)y(n-1), xn, yn и xn, yn,
> x1, y1 (точки упорядочены по часовой стрелке).

Ещё  осталось упорядочить точки по часовой стрелке :)


maVladimir   (2005-10-19 13:05:00) [7]

Можно сделать так:
Пусть многоугольник задан n точками. Тогда для каждой стороны многоугольника (Ax, Ay, Bx, By) находим и сохраняем 3 величины
a = Ay-By
b = Bx-Ax
c = Ax*By-Bx*Ay
это коэффициенты прямой ax + by + c = 0, проходящей через 2 точки.
Порядок точек для определения уравнения прямой очень важен, поэтому делай так: считай сначала для x1, y1, x2, y2, затем x2, y2, x3, y3 и далее до x(n-1)y(n-1), xn, yn и xn, yn, x1, y1 (точки упорядочены по часовой стрелке).

При отрисовке каждого многоугольника считай эти величины и сохраняй их в каком-нибудь массиве.

Далее, в OnMouseDown проверяй, если для какого-либо многоугольника при подстановке координат X и Y в ax + by + c для каждой стороны все полученные значения будут <= 0, то точка лежит внутри этого многоугольника.

Алгоритм работает для любого выпуклого многоугольника.

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


TButton   (2005-10-19 12:31:00) [8]

о госоподи
за него задачу нахаляву решили а он... =)

смотри
ты считаешь расстояние от точки до линии
если оно меньше либо равно 0.5 (пол пикселя)
ты запоминаешь эту линию
и обрываешь цикл

причем тут пересечение?


DDDeN   (2005-10-19 08:54:00) [9]

неплохо...
но мож кто-нить поможет идеей?

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


Opuhshii   (2005-10-19 08:08:00) [10]

2DDDeN   (19.10.05 07:08) [9]

"Дэнги давай!, дэнги давай,.  давай дэнги!" (с)


DDDeN   (2005-10-19 07:08:00) [11]

метод понял... а циферки внизу нет.


TButton   (2005-10-19 07:07:00) [12]

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

далее
можно определить какой фигуре принадлежит линия

Z205476197409
R721352166648

=)


DDDeN   (2005-10-19 06:49:00) [13]

новый факт! в задании указано, что
"... на белом фоне рисуется произвольное количество замкнутых фигур прямоугольной формы под разным углом... "
то есть надо просто нарисовать границы фигур.
получается нечто такое:
http://cda.rikt.ru/01.gif


Gydvin   (2005-10-19 06:47:00) [14]

А храни координаты каждой в двухмерном массиве.

в mousedown

for a:=0 to length(array) do
if (x>array[a,0]) and(x<array[a,0]+фигура.width) and (y>array[a,1]) and(y<array[a,1]+фигура.height) then begin showmessage('Фигура №'+intostr(x));
exit;
end;


ширину и высоту тоже можно хранить в массиве ;)


MBo   (2005-10-19 06:38:00) [15]

>DDDeN   (19.10.05 06:31) [4]
Тогда предложенный метод  при определении фигур особенно хорош ;)


DDDeN   (2005-10-19 06:31:00) [16]

2 MBo
а если фигурок много, например 100 штук?


MBo   (2005-10-19 06:28:00) [17]

Если нет возможности определить по координатам, в какую именно фигуру входит "кликнутая" точка, то воспользуйся таким методом:
Рисуй каждую фигуру на дополнительном битмапе, закрашивая ее уникальным цветом - например - цвет - номер фигуры. Тогда Pixels[] даст тебе нужную информацию.


DDDeN   (2005-10-19 05:57:00) [18]

а почему? :(
а кто мож еще знает... помогите, а? контрольная горит... :((


TButton   (2005-10-19 05:55:00) [19]

знаю, но не скажу =)


Наверх

Титульная страница Поиск, карта сайта Написать письмо