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)+')';


Zeqfreed   (2006-08-22 01:30:00) [41]

Как один из вариантов, можно построить quad-tree для всего поля, где каждый лист (насколько я могу вспомнить терминологию) будет соответствовать ограничивающему прямоугольнику для каждой отдельной клетки. Затем, я бы, чтобы не заморачиваться с формулами взял ч/б маску клетки и проверял попадание по отобраным поиском в quad-tree клеткам по маске. В теории это должно быстро работать :)


Селезин   (2006-08-22 01:25:00) [42]

А хде, собственна координаты? Насколько я понял, функция выдает попадание в какую-то клетку, а не координаты этой клетки. Это значит, 4 раза вызывать функцию и делать проверку по 12 условиям?

Суть-то не в том, что проблемно вычислить координаты, а в том, что их постоянный обсчет вызывает тормознутость мышки. Вот если бы координаты каким-то образом впихнуть в глобальную переменную и изменять ее только при переходе через границу (например)...


Ketmar   (2006-08-22 00:59:00) [43]

выдрал из своего проекта. пояснять лениво. %-)

function TfmMain.IsMouseInCell (x, y: Integer): Boolean;
var
 sx, sy: Integer;
begin
 sx := 90+x*42; sy := 60+y*32+15-15*(x mod 2);
 sx := msX-sx; sy := msY-sy;
 result := false;
 if (sx < 1) or (sx > 50) or (sy < 1) or (sy > 34) then exit;
 if (sy < 15) and ((sx < 7-(sy-1) div 2) or (sx > 44+(sy-1) div 2)) then exit;
 if (sy > 20) and ((sx < (sy-19) div 2) or (sx > 51-(sy-19) div 2)) then exit;
 result := true;
end;


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

Наверх

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