![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение обекта на 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]знаю, но не скажу =)