Как рассчитать высоту и ширину изометрического прямоугольника / квадрата - PullRequest
7 голосов
/ 06 января 2011

Я пишу изометрическую плитку.Каждая плитка в два раза шире, чем высокая (w: h = 2: 1).Все плитки на карте имеют одинаковый размер, а их ширина и высота известны (TileWidth и TileHeight).

Может быть любое количество столбцов (> 0) и строк (> 0).

Я изо всех сил пытаюсь придумать формулу для расчета ширины и высоты полностью нарисованной карты.Это должно быть расстояние от самого верха до самого низа и крайнего левого до крайнего правого.Поскольку количество столбцов и строк может варьироваться (и, следовательно, карта не всегда является идеальным ромбом), это очень сложно!

Ответы [ 5 ]

5 голосов
/ 06 января 2011

Хороший вопрос!Существует не слишком очевидный ответ, но его легко вычислить:

Давайте назовем ось строки «r» и ось столбца «c», и рассмотрим первое изображение, где экстент по оси r равен5, а экстент по оси c равен 3.

Приращение единицы по оси r относительно плоскости рисования составляет угол +30 = (cos 30 °, sin 30 °) = (sqrt (3) / 2, 0,5), а приращение единицы по оси c составляет -30 = (cos 30 °, -sin 30 °) = (sqrt (3) / 2, -0,5).

Вы должны рассмотреть две диагонали вашего изометрического прямоугольника.На первом рисунке эти диагонали имеют D1 = [+ 5 * U вдоль оси r и + 3 * U вдоль оси c] и D2 = [+ 5 * U вдоль оси r и -3 * U вдоль оси c], где U - длина плитки в изометрической плоскости.При преобразовании в плоскость рисования это становится D1 = ((5 + 3) * sqrt (3) / 2 * U, (5-3) / 2 * U) = (4 * sqrt (3) * U, 1 *U) и D2 = ((5-3) * sqrt (3) / 2 * U, (5 + 3) / 2 * U) = (sqrt (3) * U, 4 * U).Следовательно, ширина и высота экрана являются максимальными из двух экстентов = 4 * sqrt (3) * U, 4 * U.

Это можно обобщить: если есть Nr строк и Nc столбцов, идлина плитки равна U, размеры диагоналей прямоугольника в плоскости рисования составляют D1 = ((Nr + Nc) * sqrt (3) / 2 * U, (Nr-Nc) / 2 * U) и D2 =((Nr-Nc) * sqrt (3) / 2 * U, (Nr + Nc) / 2 * U), поэтому ширина и высота экрана составляют:

W = U*(Nr+Nc)*sqrt(3)/2
H = U*(Nr+Nc)/2
2 голосов
/ 06 января 2011

Углы изометрической проекции составляют 60 градусов и 30 градусов.Фактическая ширина и высота плитки будут:

Wiso = TileWidth * Cos(30) + TileHeight * Cos(60)
Hiso = TileWidth * Sin(30) + TileHeight * Sin(60)

Теперь вы можете умножить эти числа на количество плиток в строке и столбце, чтобы получитьразмер сетки.

РЕДАКТИРОВАТЬ: глядя на ваши изображения, кажется, что проекция не изометрическая (по крайней мере, не то, что я изучал в школе), и углы 60 градусов в обе стороны, поэтому замените Cos(60) с Cos(30) и Sin(60) с Sin(30)

Другой способ взглянуть на это:

Wgrid = TileWidth * Cos(30) * Ncols + TileHeight * Cos(30) * Nrows
Hgrid = TileWidth * Sin(30) * Ncols + TileHeight * Sin(30) * Nrows

0 голосов
/ 06 января 2011

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

Таким образом, ширина ограничивающей ось ограничительной рамки длякарта (rows+columns)*TileWidth/2 и высота (rows+columns)*TileHeight/2

0 голосов
/ 06 января 2011

Я думаю, вы могли бы сделать это с помощью теоремы Пифагора :

halfWidth = tileWidth / 2;
halfHeight = tileHeight / 2;
h = Math.sqrt((halfWidth * halfWidth ) * (halfHeight * halfHeight));
rowLength = rowSize * h;
colLength = colSize * h;

Моя математика не велика, но h должно быть длиной одной стороны плитки, чтобы вызатем можно умножить это на количество плиток.

0 голосов
/ 06 января 2011

Почему бы не использовать уравнения вращения следующим образом:

Предположим, что плитки не вращаются, поэтому четыре угла имеют следующие координаты:

(0, 0, 0)
(w, 0, 0)
(0, h, 0)
(w, h, 0)

, где

w = Number of Columns * Tile Width
h = Number of Rows * Tile Height

Теперь я предполагаю, что у вас есть матрица проекции, поэтому после ее применения вы получите 2D экранные координаты 4 3D точек, и вам нужно сделать следующее:

  1. Получить минимальную x-координату всех точек (после проекции).
  2. Получить максимальную x-координату всех точек (после проекции).
  3. Получить минимальную y-координату всех точек (после проекции).
  4. Получить максимальную Y-координату всех точек (после проекции).

Вычтите 1 из 2, и вы получите ширину, и 3 из 4, чтобы получить высоту.

Это помогает?

...