Aceton
В п. 18 мой вариант, там всё правильно считается, и проще.
делим каждый хекс на шесть треугольников с общей вершиной в центре, замечаем, что все треугольники образуют косоугольную систему координат. линейным преобразованием находим координаты произвольной точки в этой системе координат, округляем их до целого значения и далее в зависимости от чётности определяем индекс хекса, которому принадлежит данный треугольник. быстрее и короче едва ли возможно.
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 это ширина и высота гекса?
записать на С++ как правильно ?
какое из слов
If Xor Then Else
тебе не понятно?))
Не разобраться в синтаксисе бейсика это надо суметь
& конкатенация
' комментарий
Aceton
cW, cH это ширина и высота ячейки
Про округление я уже писал, Int округляет аналогично C++, при делении на целое мы получаем не целую часть частного, а само частное, то есть делимое и делитель приводятся автоматически к Single или Double. Тип Long - это Signum Int32.
Если аргумент представляет собой отрицательное число, то функция Int возвращает первое целое отрицательное число, меньшее или равное значению аргумента, А в С++ всегда идет целая часть
поэтому такой пример не будет адекватно работать
чтобы в С++ получить значение целое и остаток можно юзать modf()
ostatok = (input_val, &celoe);
так что Mikle не путайте Int() Basic c (int) C++
Теперь понятно, почему моя DLL на CPP искажает результат... :)
кстати Mikle, как найти координаты центров ромбов в твоем варианте?
ISO_YM=(ISO_X-ISO_Y)*ISO_WIDTH_HALF;
ISO_XM = ((ISO_X + ISO_Y) * ISO_HEIGHT_HALF) +ISO_HEIGHT_HALF;
Результат тот же:
cX = (IY + IX + 1) * cW \ 2
cY = (IX - IY) * cH \ 2
Если я правильно понял суть вопроса, то нужно проверить лежит ли точка A(x;y) в некоем выпуклом многоугольнике.
Если да, то это делается через сумму углов: будем последовательно брать все пары точек n и n[i+1](i - от 0 до k-1, где k это - кол-во вершин многоугольника), и брать углы nAn[i+1], добавляя их к сумме. В итоге, если точка лежит внутри многоугольника, то сумма будет равна (2*PI) или -(2*PI), если на границе, то PI или -PI, а если вне то 0. Вроде так 8)
у мну функция такая. учитывает отрицательные координаты.
конвертирует "мышку" в сеточные координаты
//оси располагаются так:
//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;
}
надеюсь понятно выразился
Я програмирую на Blitz3D,много чего еще не понимаю.Вот мой вопрос в п.22 описывается поле из шестиугольных гексов,я не пойму а как сместить расчеты поля например по Х на 100 и по Y на сто.Весь мозг сломал так и не получилось.Подскажите пожалуста.
если каждый хекс обвести прямоугольником. то для любой точки будет 2 прямоугольника или один.. ну а там проверить ерунда.
для ромба просто берется две стороны v1 и v2. и решаться уравнение v1*x+v2*y = p.
Тема в архиве.