2010-12-12 73 views
1

J'ai un code qui construit une carte hexagonale:Problème de création de carte hexagonale

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)); 
    } 
} 

Il semble ici si: Screnshot

Pourquoi entre les lignes il y a une distance? Et les balles ne se trouvent pas densément?

Merci!

Répondre

2

Vous essayez de produire un hexagonal packing, pas un emballage carré.

alt text

La distance verticale entre les centres des cercles devrait être inférieur au diamètre du fait que les sommets de la seconde rangée de remplir les trous entre le fond de la première rangée, amenant les cadres de délimitation des deux premiers lignes à chevaucher légèrement. Notez que dans la première image, il n'y a que cinq rangées de cercles, mais dans la seconde, il y a six rangées, bien que la deuxième garniture ne prenne pas beaucoup plus d'espace vertical.

La différence de hauteur réelle entre les lignes est height of an equilateral triangle avec des côtés égaux au diamètre de votre cercle, qui peut être calculé en utilisant le Pythagorean Theorem, par exemple.

Essayez y_position = sqrt(3)/2 * diameter * y.

+0

Un grand merci! Réponse très utile. – matvey

0

Les centres de trois cercles adjacents forment un triangle équilatéral, la longueur du bord étant le diamètre (32 dans votre exemple). Ainsi, la distance entre le centre du cercle inférieur et la ligne reliant les centres des cercles supérieurs serait de (3)/2 fois cette valeur (27,7 dans votre exemple). Ainsi, int y_position = 27.7 * y;

0

le calcul de y_pos est votre bug:

Cela devrait corriger: int y_position = sin (pi/3) * diamater * y;

Vous pouvez mettre en cache sin (pi/3) pour améliorer les performances.