Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Определение обекта на TImage   Найти похожие ветки 

 
DDDeN   (2005-10-19 05:42) [0]

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


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

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


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

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


 
MBo ©   (2005-10-19 06:28) [3]

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


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

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


 
MBo ©   (2005-10-19 06:38) [5]

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


 
Gydvin ©   (2005-10-19 06:47) [6]

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

в 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;


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


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

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


 
TButton ©   (2005-10-19 07:07) [8]

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

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

Z205476197409
R721352166648

=)


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

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


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

2DDDeN   (19.10.05 07:08) [9]

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


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

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

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


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

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

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

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


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

Можно сделать так:
Пусть многоугольник задан 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 намного эффективнее, особенно если количество прямоугольников будет очень велико.


 
LEk ©   (2005-10-19 13:54) [14]


> Порядок точек для определения уравнения прямой очень важен,
> поэтому делай так: считай сначала для 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) [15]


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

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


 
Leonid Troyanovsky ©   (2005-10-19 15:47) [16]


> DDDeN   (19.10.05 05:42)  

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


CreatePolygonRgn, PtInRegion, DeleteObject.

--
Regards, LVT.


 
WondeRu ©   (2005-10-19 15:59) [17]

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


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

[16]


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.072 c
14-1130082264
n0name
2005-10-23 19:44
2005.11.13
Размер EXE.


14-1130101965
saNat
2005-10-24 01:12
2005.11.13
Поиск ошибки в проекте


4-1124876130
Scordion
2005-08-24 13:35
2005.11.13
Как сделать форму поверх всех приложений?


9-1120154182
cherep36
2005-06-30 21:56
2005.11.13
GLScene


14-1129714217
Иксик
2005-10-19 13:30
2005.11.13
Горбачев посоветовал Америке "перестроиться"