![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расчет координат [D7]
Селезин © (2006-08-22 00:54:00)Не знаю, куда правильнее написать, сюда или в игровой форум. Ну, перекинут, если что.
Задачка такая. Имеется карта из гексагонов (шестиугольников). При движении мыши по карте необходимо подсчитывать координаты текущего гексагона и выдавать его в label. Гексагоны симметричные с горизонтальными верхними и нижними сторонами. Ширина гексагона - 68 по максимуму, 32 по горизонтальной стороне. Высота гексагона - 50.
В принципе, задача решена, но замечено, что мышка слегка притормаживает при перемещении курсора по карте. Как бы быстро справиться с обсчетом, чтобы не отражалось
Xleft := (X-32) div 50;
YTop := (Y-25) div 50;
X1 := Xleft*50+32;
X2 := X1+50;
Y1 := YTop*50+25;
Y2 := Y1+25;
Y3 := Y2+25;
if (Odd(XLeft)) then
begin
if (sqr(X-X1)+sqr(Y-Y1)<=sqr(X-X2)+sqr(Y-Y2)) AND (sqr(X-X1)+sqr(Y-Y1)<=sqr(X-X1)+sqr(Y-Y3)) then
begin
XRes := XLeft;
YRes := YTop;
end
else
if (sqr(X-X2)+sqr(Y-Y2)<=sqr(X-X1)+sqr(Y-Y1)) AND (sqr(X-X2)+sqr(Y-Y2)<=sqr(X-X1)+sqr(Y-Y3)) then
begin
XRes := XLeft+1;
YRes := YTop;
end
else
if (sqr(X-X1)+sqr(Y-Y3)<=sqr(X-X1)+sqr(Y-Y1)) AND (sqr(X-X1)+sqr(Y-Y3)<=sqr(X-X2)+sqr(Y-Y2))
then
begin
XRes := XLeft;
YRes := YTop+1;
end;
end
else
begin
if (sqr(X-X1)+sqr(Y-Y2)<=sqr(X-X2)+sqr(Y-Y1)) AND (sqr(X-X1)+sqr(Y-Y2)<=sqr(X-X2)+sqr(Y-Y3))
then
begin
XRes := XLeft;
YRes := YTop;
end
else
if (sqr(X-X2)+sqr(Y-Y1)<=sqr(X-X1)+sqr(Y-Y2)) AND (sqr(X-X2)+sqr(Y-Y1)<=sqr(X-X2)+sqr(Y-Y3))
then
begin
XRes := XLeft+1;
YRes := YTop;
end
else
if (sqr(X-X2)+sqr(Y-Y3)<=sqr(X-X1)+sqr(Y-Y2)) AND (sqr(X-X2)+sqr(Y-Y3)<=sqr(X-X2)+sqr(Y-Y1))
then
begin
XRes := XLeft+1;
YRes := YTop+1;
end;
end;
alphaWind1.Caption := '('+IntToStr(XRes)+':'+IntToStr(YRes)+')';
Селезин (2006-08-22 02:49:00) [21]Что значит как всегда? Неужто лабель такой тормознутый? Пойду вешаться.
Да, нету там никаких прозрачных окон.
Ketmar (2006-08-22 02:37:00) [22]> [21] Селезин © (22.08.06 02:35)
вот "alphaWind1" меня сильно смущает. ну и -- неизветсно, на ком этот label лежит. так что все беды от 17-й строки, как всегда.
Селезин (2006-08-22 02:35:00) [23]Черта с два, это самый обычный TLabel
Ketmar (2006-08-22 02:30:00) [24]> [19] Селезин © (22.08.06 02:27)
таки наверное потому, что по сведениям моего телепатора это окно с альфа-каналом.
Селезин (2006-08-22 02:27:00) [25]Прилично-неприлично. От вас тоже коментариев не было.
А весь прикол в следующем. Тормоза возникают в строкеalphaWind1.Caption := '('+IntToStr(XRes)+':'+IntToStr(YRes)+')';Надеюсь здесь комментариев не надо. Таки интересно, почему?
guav (2006-08-22 02:27:00) [26]Кстати, о квадратах. _разных_ там только 5, так что можно ещё оптимизировать, ничего не меняя
Ketmar (2006-08-22 02:14:00) [27]> [16] Джо © (22.08.06 02:11)
да я тоже. увидел кучу ужоса и просто нервно закурил. %-)
Джо (2006-08-22 02:11:00) [28]> [15] Ketmar © (22.08.06 02:10)
> кстати, ради интереса: 10000000 возведений в квадрат у меня
> выполняется за ~50 миллисекунд. вопрос: а в этом ли тормоза?
Фиг знает. Я сабжевый код не запускал, или, боже упаси, не анализировал. Вообще, ИМХО, такой код без комментариев выкладывать — неприлично. :(
Ketmar (2006-08-22 02:10:00) [29]кстати, ради интереса: 10000000 возведений в квадрат у меня выполняется за ~50 миллисекунд. вопрос: а в этом ли тормоза?
Джо (2006-08-22 02:03:00) [30]> [13] Ketmar © (22.08.06 01:53)
> > [11] Джо © (22.08.06 01:50)
> 5 делений и 3 умножения ещё меньше. %-)
Да я и не спорю. Так, спросонок выдвигаю непроверенные идеи. :)
Ketmar (2006-08-22 01:53:00) [31]> [11] Джо © (22.08.06 01:50)
5 делений и 3 умножения ещё меньше. %-)
Джо (2006-08-22 01:50:00) [32]> [11] Джо © (22.08.06 01:50)
> Ну уж поменьше, чем 25 квадратных корней в [0] ;-p
Пардон, "возведений в квадрат". :)
Джо (2006-08-22 01:50:00) [33]> [9] Ketmar © (22.08.06 01:47)
> > [8] Джо © (22.08.06 01:44)
> ты накладные расходы прикинул на всю эту кухню? %-)
Ну уж поменьше, чем 25 квадратных корней в [0] ;-p
guav (2006-08-22 01:49:00) [34]Откуда вызывается та процедура из [0] ?
Если из OnMouseMove, то можно переместить в OnIdle (событие компонента TApplicationEvents).
Ketmar (2006-08-22 01:47:00) [35]> [8] Джо © (22.08.06 01:44)
ты накладные расходы прикинул на всю эту кухню? %-)
Джо (2006-08-22 01:44:00) [36]> [6] Ketmar © (22.08.06 01:40)
> > [4] Джо © (22.08.06 01:32)
> много регионов надо.
А к тому же — почему "много"?
Действие первое: определяем ближайщие (в определенном радиусе) гексагоны по расстоянию от курсора до произвольной (скажем, первой) вершины гексагона. Или от курсора до центра тяжести. Оставшиеся гексагоны по одному "превращаем" в regions и проверяем до первого "попадания".
Джо (2006-08-22 01:41:00) [37]> [6] Ketmar © (22.08.06 01:40)
> > [4] Джо © (22.08.06 01:32)
> много регионов надо
А мне их не жалко :)
Ketmar (2006-08-22 01:40:00) [38]> [4] Джо © (22.08.06 01:32)
много регионов надо. %-) моя функция делает почти то же самое, но для частного случая. %-)
смотри: sx и sy -- это начало rect'а ячейки. msX и msY -- это мышь. дальше идёт как раз определение, валяется ли мышь в нужном регионе. %-)
Ketmar (2006-08-22 01:36:00) [39]> [2] Селезин © (22.08.06 01:25)
а координаты, собственна, -- эта rectangle. а дальше -- цикл. даже на моём pIII/600 это ну никак не тормозит. да и обратить функцию не так сложно, просто мне лениво. %-) зато кода немного.
Джо (2006-08-22 01:32:00) [40]Не знаю, поправит ли это проблемы с производительностью, но не пробовал использовать Region functions из GDI? Т.е, в данном случае,
PtInRegion.