2010-12-12 2 views
1

У меня есть код, который строит шестигранную карту:Проблемы создания шестигранных карт

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

Почему между рядами есть расстояние? И шары лежат не плотно?

Спасибо!

ответ

2

Вы пытаетесь создать hexagonal packing, а не квадратную упаковку.

alt text

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

Фактическая разность высот между рядами - height of an equilateral triangle со сторонами, равными диаметру вашего круга, который может быть рассчитан, например, с помощью Pythagorean Theorem.

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

+0

Большое спасибо! Очень полезный ответ. – matvey

0

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

0

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

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

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

Смежные вопросы