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

Isometric and Hexagon (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
17:08, 20 дек. 2009

Aceton
В п. 18 мой вариант, там всё правильно считается, и проще.


#31
21:16, 20 дек. 2009

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

#32
21:50, 20 дек. 2009

    SX = X * 2 / cW
    IX = Int(SX)
    SX = SX - IX
    SY = Y * 4 / (cH * 3)
    IY = Int(SY)
    If (IX And 1) Xor (IY And 1) Then
      SY = SY + SX / 3
    Else
      SY = SY + (1 - SX) / 3
    End If
    IY = Int(SY)
    IX = Int((IX - IY) * 0.5)
    'Всё!

  labX = "IX = " & Format(IX, "0")
  labY = "IY = " & Format(IY, "0")

я данный язык не знаю
и cW, cH это ширина и высота гекса?
записать на С++ как правильно ?

#33
22:33, 20 дек. 2009

какое из слов
If  Xor  Then  Else
тебе не понятно?))
Не разобраться в синтаксисе бейсика это надо суметь

& конкатенация
' комментарий

#34
11:08, 21 дек. 2009

Aceton
cW, cH это ширина и высота ячейки
Про округление я уже писал, Int округляет аналогично C++, при делении на целое мы получаем не целую часть частного, а само частное, то есть делимое и делитель приводятся автоматически к Single или Double. Тип Long - это Signum Int32.

#35
12:52, 21 дек. 2009

Если аргумент представляет собой отрицательное число, то функция Int возвращает первое целое отрицательное число, меньшее или равное значению аргумента, А в С++ всегда идет целая часть

поэтому такой пример не будет адекватно работать

#36
18:09, 21 дек. 2009

чтобы в С++ получить значение целое  и остаток можно юзать modf()

ostatok = (input_val, &celoe);

так что Mikle не путайте Int() Basic c (int) C++

#37
18:23, 21 дек. 2009

Теперь понятно, почему моя DLL на CPP искажает результат... :)

#38
22:45, 21 дек. 2009

кстати Mikle,  как найти координаты центров ромбов в твоем варианте?

#39
10:25, 22 дек. 2009

  ISO_YM=(ISO_X-ISO_Y)*ISO_WIDTH_HALF;
  ISO_XM = ((ISO_X + ISO_Y) * ISO_HEIGHT_HALF) +ISO_HEIGHT_HALF;

#40
11:52, 22 дек. 2009

Результат тот же:
    cX = (IY + IX + 1) * cW \ 2
    cY = (IX - IY) * cH \ 2

#41
12:57, 8 янв. 2010

Если я правильно понял суть вопроса, то нужно проверить лежит ли точка A(x;y) в некоем выпуклом многоугольнике.
Если да, то это делается через сумму углов: будем последовательно брать все пары точек n и n[i+1](i - от 0 до k-1, где k это - кол-во вершин многоугольника), и брать углы nAn[i+1], добавляя их к сумме. В итоге, если точка лежит внутри многоугольника, то сумма будет равна (2*PI) или -(2*PI), если на границе, то PI или -PI, а если вне то 0. Вроде так 8)

#42
19:17, 16 фев. 2010

у мну функция такая. учитывает отрицательные координаты.

конвертирует "мышку" в сеточные координаты

//оси располагаются так:
//X слева снизу -> право верх
//Y слева сверху -> право вниз.

ROMB_H 75
ROMB_W 150

  static void ScrToFloor(int &px,int &py)
  {
    int rx,ry;

    px-=start_x;//смещение оси
    py-=start_y;

    rx=(ROMB_W/ROMB_H)*px - py;
    ry=(ROMB_W/ROMB_H)*px + py;

    bool xm=(rx<0);
    bool ym=(ry<0);

    rx/=ROMB_H;
    ry/=ROMB_H;

    px=rx-xm;
    py=ry+1-ym;
  }

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

Прошло более 10 месяцев
#43
22:52, 16 дек. 2010

Я програмирую на Blitz3D,много чего еще не понимаю.Вот мой вопрос в п.22 описывается поле из шестиугольных гексов,я не пойму а как сместить расчеты поля например по Х на 100 и по Y на сто.Весь мозг сломал так и не получилось.Подскажите пожалуста.

#44
1:06, 17 дек. 2010

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

для ромба просто берется две стороны v1 и v2. и решаться уравнение  v1*x+v2*y = p.

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

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