NeoGuru
> просто пока смотрю сколько на форуме нормальных программистов
Сколько уже насчитал?
P.S А не лучше считать по готовым программам(играм?)?
в самой программе есть подсказки
специально сделал)
sb3d
не... так сложно
исходников ведь не видно
а как тут предлагают подобное воплощать
говорит... что люди искать не умеют
и им легче изгаляться
чем допустим нормальную математику просчитать
а кто знает тот не делиться
а начинают делиться как только услышат что на продажу готовишь
NeoGuru
> не... так сложно
> исходников ведь не видно
А зачем тебе исходники? Если продукт программиста успешен, не надо никаких исходников для его оценки, он успешен.
> и им легче изгаляться
> чем допустим нормальную математику просчитать
Вот в том и дело, что часто лучше сделать готовую игру, чем вылизывать какую-то особо 'нормальную' математику.
NeoGuru
> просто пока смотрю сколько на форуме нормальных программистов
Тут не столько программист или математик нужен, сколько просто человек с пространственным мышлением.
Вот вариант: Iso-Hex
Для изометрии вообще две строчки, для гексагонов чуть больше. Повернутые на 90 градусов гексагоны делать не стал, математика та же, просто X и Y местами поменять.
Mikle
>>Тут не столько программист или математик нужен, сколько просто человек с пространственным мышлением.
я знал все эти данные что в #16 но посчитать никак не мог.
спасиб за формулы
sb3d
это ты например Кармак'у расскажи
что проект успешен независимо от того как там внутри сделанно)))
NeoGuru
Зачем крайности?
> это ты например Кармак'у расскажи
> что проект успешен независимо от того как там внутри сделанно
А фишка то в чём?
Она в том, что игроку код совершенно не важен. Игроку абсолютно по-барабану, как реализовано попадание в гексы, формулой или маской, или ещё как. Вот в чём дело-то. Уверен, Кармак это понимает.
P.S. Это даже не говоря про то, что для игры на первом месте обычно игропроцесс, а на втором арт и музыка.
вот изометрия: (в моем примере она считается в другой последовательности чем у 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)
так что наслаждайтесь у вас теперь 2 примера как считать это правильно
а не через маски или другой гемор
NeoGuru
>>'размеры сетки
>>'ISO_HEIGHT = 41 - 1
>>'ISO_WIDTH = 77 - 1
а вот это уже интересно. Раскажи для чего.
Rip
'размеры сетки
'ISO_HEIGHT = 41 - 1
'ISO_WIDTH = 77 - 1
'половинные размеры сетки
ISO_HEIGHT_HALF = 20
ISO_WIDTH_HALF = 38
тут ведь все подписанно
размеры сетки - не используются
это задача на сообразительность
объясню ход решения
для ромбов ширины 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=
ВСЕ
а на 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;
Aceton
В бейсике округляется до ближайшего, то есть, если в бейсике так:
dim x as single dim y as long y = x
То в C++ будет так:
float x; int y; y = ( int )( x + 0.5 );
почему кстати , если с ромбами задать
'верхняя точка начала
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
Тема в архиве.