Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Расчет координат [D7]


Страницы:   1 2 3

Селезин ©   (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.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо