Войти
ПрограммированиеФорум2D графика и изометрия

Isometric and Hexagon (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
10:02, 24 сен. 2009

NeoGuru
> просто пока смотрю сколько на форуме нормальных программистов
Сколько уже насчитал?

P.S А не лучше считать по готовым программам(играм?)?


#16
10:37, 24 сен. 2009
Isometric and Hexagon | Isometric and Hexagon

в самой программе есть подсказки
специально сделал)


sb3d
не... так сложно
исходников ведь не видно
а как тут предлагают подобное воплощать
говорит... что люди искать не умеют
и им легче изгаляться
чем допустим нормальную математику просчитать


а кто знает тот не делиться
а начинают делиться как только услышат что на продажу готовишь

#17
11:01, 24 сен. 2009

NeoGuru
> не... так сложно
> исходников ведь не видно
А зачем тебе исходники? Если продукт программиста успешен, не надо никаких исходников для его оценки, он успешен.

> и им легче изгаляться
> чем допустим нормальную математику просчитать
Вот в том и дело, что часто лучше сделать готовую игру, чем вылизывать какую-то особо 'нормальную' математику.

#18
11:28, 24 сен. 2009

NeoGuru
> просто пока смотрю сколько на форуме нормальных программистов
Тут не столько программист или математик нужен, сколько просто человек с пространственным мышлением.
Вот вариант: Iso-Hex
Для изометрии вообще две строчки, для гексагонов чуть больше. Повернутые на 90 градусов гексагоны делать не стал, математика та же, просто X и Y местами поменять.

#19
11:39, 24 сен. 2009

Mikle

>>Тут не столько программист или математик нужен, сколько просто человек с пространственным мышлением.

я знал все эти данные что в #16 но посчитать никак не мог.

спасиб за формулы

#20
11:58, 24 сен. 2009

sb3d
это ты например Кармак'у расскажи
что проект успешен независимо от того как там внутри сделанно)))

#21
13:34, 24 сен. 2009

NeoGuru
Зачем крайности?

> это ты например Кармак'у расскажи
> что проект успешен независимо от того как там внутри сделанно
А фишка то в чём?
Она в том, что игроку код совершенно не важен. Игроку абсолютно по-барабану, как реализовано попадание в гексы, формулой или маской, или ещё как. Вот в чём дело-то. Уверен, Кармак это понимает.

P.S. Это даже не говоря про то, что для игры на первом месте обычно игропроцесс, а на втором арт и музыка.

#22
13:56, 24 сен. 2009


вот изометрия: (в моем примере она считается в другой последовательности чем у Mikle)
и есть дополнительные настройки

Dim GrilleU, GrilleV
Dim GrilleX, GrilleY
Dim ISO_HEIGHT_HALF, ISO_WIDTH_HALF

'верхняя точка начала
GrilleX = 175
GrilleY = 182

'размеры сетки
'ISO_HEIGHT = 41 - 1
'ISO_WIDTH = 77 - 1

'половинные размеры сетки
ISO_HEIGHT_HALF = 20
ISO_WIDTH_HALF = 38

RealX = X - GrilleX
RealY = Y - GrilleY
GrilleU = Int((RealX * ISO_HEIGHT_HALF + RealY * ISO_WIDTH_HALF) / (2 * ISO_HEIGHT_HALF * ISO_WIDTH_HALF))
GrilleV = Int((-RealX * ISO_HEIGHT_HALF + RealY * ISO_WIDTH_HALF) / (2 * ISO_HEIGHT_HALF * ISO_WIDTH_HALF))

Текст1.Text = GrilleU
Текст2.Text = GrilleV
Текст3.Text = X
Текст4.Text = Y
Текст5.Text = GrilleX + ((GrilleU - GrilleV) * ISO_WIDTH_HALF)
Текст6.Text = GrilleY + ((GrilleU + GrilleV) * ISO_HEIGHT_HALF) + ISO_HEIGHT_HALF
'(GrilleY + (GrilleU * ISO_HEIGHT_HALF) + (GrilleV * ISO_HEIGHT_HALF)) + ISO_HEIGHT_HALF


вот гекс 1

a = 46
b = 50
s = 26
h = 12
r = 23


m = h / r
sectx = Int(X / (2 * r))
secty = Int(Y / (h + s))
sectPxlx = X Mod (2 * r)
sectPxly = Y Mod (h + s)

If secty Mod 2 = 0 Then
'type A
If sectPxly < (h - sectPxlx * m) Then
secty = secty - 1
sectx = sectx - 1
End If
If sectPxly < (-h + sectPxlx * m) Then
secty = secty - 1
End If
Else
'type B
If sectPxlx >= r Then
If sectPxly < (2 * h - sectPxlx * m) Then
secty = secty - 1
End If
End If
If sectPxlx < r Then
If sectPxly < (sectPxlx * m) Then
secty = secty - 1
Else
sectx = sectx - 1
End If
End If
End If


Текст1.Text = sectx
Текст2.Text = secty
Текст3.Text = X
Текст4.Text = Y

Текст5.Text = ((secty Mod 2) + 1) * r + (2 * r * sectx)
Текст6.Text = (s + h) * secty + h + s / 2

вот гекс 2


a = 46
b = 50
s = 26
h = 12
r = 23

m = h / r
sectx = Int(X / (h + s))
secty = Int(Y / (2 * r))
sectPxlx = X Mod (h + s)
sectPxly = Y Mod (2 * r)

If sectx Mod 2 = 0 Then
'type
If sectPxlx < (h - sectPxly * m) Then
secty = secty - 1
sectx = sectx - 1
End If
If sectPxlx < (-h + sectPxly * m) Then
sectx = sectx - 1
End If

Else

'type
If sectPxly >= r Then
If sectPxlx < (2 * h - sectPxly * m) Then
sectx = sectx - 1
End If
End If
If sectPxly < r Then
If sectPxlx < (sectPxly * m) Then
sectx = sectx - 1
Else
secty = secty - 1
End If
End If

End If

Текст1.Text = sectx
Текст2.Text = secty
Текст3.Text = X
Текст4.Text = Y
Текст5.Text = (s + h) * sectx + h + s / 2
Текст6.Text = ((sectx Mod 2) + 1) * r + (2 * r * secty)

#23
14:01, 24 сен. 2009

так что наслаждайтесь у вас теперь 2 примера как считать это правильно
а не через маски или другой гемор

#24
14:45, 24 сен. 2009

NeoGuru
>>'размеры сетки
>>'ISO_HEIGHT = 41 - 1
>>'ISO_WIDTH = 77 - 1

а вот это уже интересно. Раскажи для чего.

#25
19:09, 24 сен. 2009

Rip

'размеры сетки
'ISO_HEIGHT = 41 - 1
'ISO_WIDTH = 77 - 1

'половинные размеры сетки
ISO_HEIGHT_HALF = 20
ISO_WIDTH_HALF = 38

тут ведь все подписанно
размеры сетки - не используются

#26
12:06, 25 сен. 2009

это задача на сообразительность
объясню ход решения

для ромбов ширины w, высоты h, координат x,y
все растянем по горизонтали на 1/w, вертикали на 1/h :
x=x/w, y=y/h
теперь квадраты c диагональю 1 под углом 45%
теперь повернем сетку на 45% и растянем (для простоты) по x,y на sqrt(2)
x2=x-y
y2=x+y
теперь квадраты со СТОРОНОЙ 1
и точка попала в квадрат ([x2],[y2]) ([]-целая часть)


шестиугольники 1й случай:
обоз. i-номер ряда,j-номер шестиугольника в ряду
x0,y0-коорд.центра шестиугольника
сначала проверим попадание в четный ряд (считая с 0)
j=[x/sqrt(3)-1/2]
x0=(j+1/2)*sqrt(3)
y0=3/2*i=3k (k-целое)
для верх. и ниж.сторон получаем условия
-1+|x-x0|/2<=y-y0<=1-|x-x0|/2
или
k<=(y+1-|x-x0|/2)/3=a
k>=(y-1+|x-x0|/2)/3=b
если между a и b есть целое число, т.е. >[a], то попали
k=
, i=2k
иначе
y0=3/2*(2k+1)=3(k+1/2)
j=[x/sqrt(3)]
x0=j*sqrt(3)
-1+|x-x0|/2<=y-3/2*i<=1-|x-x0|/2
i>=(2(y-1)+|x-x0|)/3=a
i<=(2(y+1)-|x-x0|)/3=b
b-a=(4-|x-x0|*2)/3 < 4/3 => между a,b лежит ОДНО целое число
i=

ВСЕ

#27
14:41, 20 дек. 2009

а на C++ такой код есть у кого? а то у меня чето видимо изза округления оно ошибочно выводит

hx = (int)(mx / (h+s));
  hy = (int)(my / (2*r));
  float sectPxlx,sectPxly;
  sectPxlx = fmod(mx,h+s);
  sectPxly = fmod(my,2*r);

  if((hy % 2)==0)
  {
    if(sectPxly <(h - sectPxlx * m)) 
    {
      hy = hy - 1;
      hx = hx - 1;
    }
    if(sectPxly < (-h + sectPxlx * m))
    {
      hy = hy - 1;
    }
  }
  else
  {
    if(sectPxlx >= r)
    {
      if(sectPxly < (2 * h - sectPxlx * m))
      {
        hy = hy - 1;
      }
    }
    if(sectPxlx < r)
    {
      if(sectPxly < (sectPxlx * m))
      {
        hy = hy - 1;
      }
      else
      {
        hx = hx - 1;
      }
    }
  }
    mhx = ((hy%2)+1)*r+(2*r*hx);
    mhy = (s+h)*hy+h+s/2;

#28
16:47, 20 дек. 2009

Aceton
В бейсике округляется до ближайшего, то есть, если в бейсике так:

dim x as single
dim y as long
y = x
То в C++ будет так:
float x;
int y;
y = ( int )( x + 0.5 );
#29
16:52, 20 дек. 2009

почему кстати , если с ромбами задать
'верхняя точка начала
GrilleX = 0
GrilleY = 0

оно не верно считает отрицательные значения GrilleV

0.-2 1.-2 2.- 2 3.-2
0.0 1.0 2.0 3.0 <<<<<---некорректно
0.0 1.0 2.0 3.0
0.1 1.1 2.1 3.1

т.е получается 2 ряда с одинаковыми координатами, хотя там должен быть ряд 0.-1 1.-1 2.- 1 3.-1

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.