Проблема создания шестнадцатеричной карты - PullRequest
1 голос
/ 12 декабря 2010

У меня есть код, который строит шестнадцатеричную карту:

int diamater = 32;    
int grid_x_size = 19;  
int grid_y_size = 5;  
for (int x=0; x<grid_x_size; x++) {  
    for (int y=0; y<grid_y_size; y++) {  
        int x_position = diamater*x+(y%2)*diamater/2;  
        int y_position = diamater*y;  
        add(new ImageSprite(image, x_position, y_position, diamater, diamater));  
     }  
}  

Это выглядит вот так: Screnshot

Почему между рядами есть расстояние? А шарики лежат не густо?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

Вы пытаетесь изготовить гексагональную упаковку , а не квадратную упаковку.

alt text

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

Фактическая разница высот между строками - это высота равностороннего треугольника со сторонами, равными диаметру вашего круга, которую можно рассчитать, например, с помощью теоремы Пифагора,

Попробуйте y_position = sqrt(3)/2 * diameter * y.

0 голосов
/ 12 декабря 2010

ваш y_pos расчет - ваша ошибка:

Это должно исправить это: int y_position = sin (pi / 3) * diamater * y;

Возможно, вы захотите кэшировать грех (pi / 3) для производительности.

0 голосов
/ 12 декабря 2010

Центры трех соседних окружностей образуют равносторонний треугольник с длиной ребра, равной диаметру (32 в вашем примере). Таким образом, расстояние между центром нижнего круга и линией, соединяющей центры верхних кругов, будет в 2 раза больше (2) (27,7 в вашем примере). Итак, int y_position = 27.7 * y;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...