Считать шестиугольники внутри прямоугольника? - PullRequest
3 голосов
/ 18 сентября 2011

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

Я знаю следующее:

rectWidth = 1280;
rectHeight = 720;
hexRadius = 50; // middle to corner
hexHeight = hexRadius * 2;
hexShortSpan = hexRadius * 0.5;
hexLongSpan = cos(radians(30)) * hexRadius;
hexWidth = hexLongSpan * 2;
hexSide = hexRadius + hexShortSpan; // this is not a side but side + shortSpan for horizontal rows

Не могу понятьмод, чтобы получить правильный результат.

float A = rectWidth / hexWidth;
float B = rectHeight / hexSide;
float hexCount = A * B +????;
// etc. etc. not sure about the rest...

Роб

Вот изображение ...

http://moggach.com/media/img/hexGrid.jpg

Ответы [ 2 ]

0 голосов
/ 18 сентября 2011

Подсказка: подсчитайте количество шестигранных углов на одной стороне. Например. сосчитать все шестнадцатеричные правые углы (X): ...

С левым верхним углом в середине первого шестиугольника ситуация менее общая. Это можно решить с помощью подсчета:

  • сколько гексов в первом ряду (разделенных по верхней границе)
  • сколько гексов во втором ряду (чуть ниже первого)
  • сколько строк первого типа (каждую секунду из первого ряда)
  • сколько строк второго типа (каждую секунду из второго ряда)

Это версия кода на Python:

from math import ceil, cos, sqrt
rectWidth = 1280
rectHeight = 720
hexRadius = 50
hexHeight = hexRadius * 2
hexHalfHeight = hexRadius/2
hexWidth = hexRadius * sqrt(3)

# First one is corner, ceil() calculates others in row
num_in_first_row = 1 + ceil( ( rectWidth - hexWidth ) /hexWidth )
num_in_second_row = ceil( rectWidth / hexWidth )

# First one is corner, ceil() starts from upper point of next hex on left border
num_of_first_rows = 1 + ceil( ( rectHeight - 2 * hexRadius ) / ( hexHeight + hexRadius ) )
# Starts from upper point of first hex in second row. Coords (hexWidth/2., hexHalfHeight)
num_of_second_rows = ceil( ( rectHeight - hexHalfHeight ) / ( hexHeight + hexRadius ) )

num = num_in_first_row * num_of_first_rows + num_in_second_row * num_of_second_rows
print num
0 голосов
/ 18 сентября 2011

Рассчитайте площадь шестиугольника и разделите площадь прямоугольника с площадью шестиугольника.

Площадь шестиугольника равна

a * a * (3 * sqrt(3)) / 2

где a - длина стороны шестиугольника.

...