forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Массивы в типе (http://forum.boolean.name/showthread.php?t=11469)

DStalk 13.12.2009 19:40

Массивы в типе
 
Мне надо написать например вот так:
Код:

Type Player
  Field Name$[2]
  Field Units[6,4,2]
End Type

Но насколько я понял многомерные массивы в типах не поддерживаются, как обойти или чем заменить эту проблемку?

H@NON 13.12.2009 19:53

Ответ: Массивы в типе
 
Для трехмерного массива индекс можно вычислить так
code:
y * ширина * глубина + x * глубина + z

где массив обьявлен так
code:
массив[ширина * высота * глубина]

а x, y, z соответственно индексы трехмерного массива
PS
"ширина * глубина" можно вычислить заранее, дабы ускорить вычисление

двумерный массив 5*5
обьявить одномерный масив размером x_max*y_max
и получать доступ по формуле id = x+y*x_max

DStalk 13.12.2009 19:57

Ответ: Массивы в типе
 
имхо это изврат))) но все равно спасибо, так и сделаю)

H@NON 13.12.2009 20:00

Ответ: Массивы в типе
 
А иначе ты и не сделаешь)

DStalk 13.12.2009 21:45

Ответ: Массивы в типе
 
И еще вопросик:


Имеется начальная точка (0,0) и пункт назначения; имеются препятствия (красным цветом), они в массиве карта[maxX,maxY].
Вопрос: как вычислить клетки по которым пойдет объект до столкновения с препятствием? Чего-то я думал, думал - каша какая-то выходит. Помогите пожалуйста)))

P.S. даже проще, если без препятствий - как вычислить по каким клеткам он пройдет? Кстати движения наискосок допускаются...

impersonalis 13.12.2009 23:20

Ответ: Массивы в типе
 
ищи путенах (алгоритмы путенахождения)

DStalk 13.12.2009 23:26

Ответ: Массивы в типе
 
Да, искал, нашел, но это не совсем то - мне не надо найти путь обхода преград, а просто линию разбить на точки (грубо говоря)...

H@NON 14.12.2009 02:04

Ответ: Массивы в типе
 
если так, то тебе нужно находить пересечение прямоугольника(клетки) с линией. Алгоритмы реализации наверняка гуляют в сети, отловить не сложно.

moka 14.12.2009 03:10

Ответ: Массивы в типе
 
Более универсально, и в некоем роде проще - это пересечение линий с линиями, и их обход. Не ограничен формами, да и по мне так, проще линии обходить, чем прямоугольники. 4 линии - вот тебе и прямоугольник ;)
ЗЫ, старое:
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 1 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

DStalk 14.12.2009 13:57

Ответ: Массивы в типе
 
Я так подумал для прямоугольника хватит и двух его диагоналей:)
А если на поле 100+ препятствий, то получается все их придется проверять на пересечение? Это не сильно скажется на производительности?

IGR 14.12.2009 14:38

Ответ: Массивы в типе
 
Цитата:

А иначе ты и не сделаешь)
ну...
Код:

Type UnitsArray
  Field x[6]
  Field y[4]
  Field z[2]
End Type

Type Player
  Field Name$[2]
  Field Units.UnitsArray
End Type


moka 14.12.2009 20:30

Ответ: Массивы в типе
 
Цитата:

Сообщение от Dstalk (Сообщение 129575)
Я так подумал для прямоугольника хватит и двух его диагоналей:)
А если на поле 100+ препятствий, то получается все их придется проверять на пересечение? Это не сильно скажется на производительности?

Сектора, и проверка на боунти бокс - и нет разницы, как много линий.

Alex.D. 14.12.2009 20:47

Ответ: Массивы в типе
 
>>проверка на боунти бокс
"баунти" это такой шоколадный батончик с кокосовой начинкой, а ему надо баундин бокс :)))

IGR 14.12.2009 21:06

Ответ: Массивы в типе
 
BoundBox !!

drwoland 03.01.2010 22:33

Ответ: Массивы в типе
 
Цитата:

Сообщение от Dstalk (Сообщение 129504)
И еще вопросик:


Имеется начальная точка (0,0) и пункт назначения; имеются препятствия (красным цветом), они в массиве карта[maxX,maxY].
Вопрос: как вычислить клетки по которым пойдет объект до столкновения с препятствием? Чего-то я думал, думал - каша какая-то выходит. Помогите пожалуйста)))

P.S. даже проще, если без препятствий - как вычислить по каким клеткам он пройдет? Кстати движения наискосок допускаются...

Клетки по которым пойдет объект из точки (startx;starty) в точку (finishx;finishy) можно посчитать так:

Код:

dx = finishx-startx
dy = finishy-starty

Angle#  = atan(dx,dy)          ;угол от начальной точки до конечной
Lenght# = sqrt(dx^2+dy^2)  ;длина проверяемого отрезка
maxsteps = 10                      ;количество шагов проверки чем больше - тем точнее проверка. Ставь его равным Abs(Lenght#) для средней точности
steplenght# = lenght/steps    ; размер одного шага.
currx# = startx
curry# = starty

for currstep = 0 to maxsteps
currX# = currx# + steplenght#*sin (angle#) ; это координаты клетки через которую пройдет объект на этом шаге
currY# = currx# + steplenght#*cos(angle#) ; округли их до минимального целого.
next



Часовой пояс GMT +4, время: 21:16.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot