Форум: "Основная";
Текущий архив: 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