Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Определение обекта на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
4-1126705615
Новичоккк
2005-09-14 17:46
2005.11.13
Определение заголовка окна по PID


5-1109368172
jonni
2005-02-26 00:49
2005.11.13
Multi Line property


14-1129748171
iZEN
2005-10-19 22:56
2005.11.13
Опавшие листья собирать в мусорные мешки: бред или реальность?


8-1119478025
Strech
2005-06-23 02:07
2005.11.13
масштабирование изображений


14-1129808697
Иксик
2005-10-20 15:44
2005.11.13
Что твориться?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский