создание 10.000 связанных шестиугольника страницы?

Я пытаюсь создать 10.000 шестиугольников, связанных друг с другом, как пчелиные гребни. Я хочу создать все это как элемент, который после того, как я смогу импортировать что-то в них. Но для соединения шестиугольников вместе мои алгоритмы застревают после соединения первых 6 элементов. Вот мой алгоритм в java. Я сделал в java для тестирования. И, кроме того, я хочу, чтобы они были меньше, чем раньше.

angle= 2*Math.PI/6; for (int i=0 ;i<6;i++){ double v = i*angle-(15); pentagon pent = new pentagon(6, 60, a); ax=a.x+(int)Math.round(105*Math.cos(v)); ay=a.y+(int)Math.round(105*Math.sin(v)); pentagonList.add(pent); 

и это мой class пентагона

 import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * * @author Meko */ public class pentagon extends JPanel { private int n, r; private double angle; public int[] x, y; Point c; int posX, posY; public pentagon(int pieces, int radie, Point center) { c = center; n = pieces; r = radie; x = new int[n]; y = new int[n]; angle = 2 * Math.PI / n; posX = cx + 1024 / 2; posY = cy + 1024 / 2; } public void drawMe(Graphics g) { g.drawString("CENTER", posX, posY); //System.out.print(" xO: "+x0); for (int i = 0; i < n; i++) { double v = i * angle - (6 * 2 * Math.PI / 360) + 15; x[i] = posX + (int) Math.round(r * Math.cos(v)); // System.out.print(" x: "+x[i]); y[i] = posY + (int) Math.round(r * Math.sin(v)); g.drawString("" + i, x[i], y[i]); } g.drawPolygon(x, y, n); } 

}

Создание прямоугольной сетки довольно очевидно – просто перекосите прямоугольную сетку (либо перекосите ее все, либо получите параллелограмм, затем используйте по модулю, чтобы обернуть ее, или перекосите альтернативные строки / столбцы, чтобы создать прямоугольную сетку).

Создание шестиугольника, заполненного шестиугольниками, довольно просто

  • в n- м ранге имеется 6 баров n гексов
  • центры смежных гексов смещены в два раза на расстояние середины одной из граней до центра

Поэтому, если у вас есть координаты x и y ваших гексов в двух массивах, polyX и polyY , вы получаете вложенный цикл:

  drawHex ( g, cx, cy, 0 ); for ( int rank = 1; rank < count; ++rank ) { for ( int bar = 0; bar < 6; ++bar ) { // x and y are twice midpoint of the previous face * the rank away // from centre int x = cx + ( polyX [ ( bar + 4 ) % 6 ] + polyX [ ( bar + 5 ) % 6 ] ) * rank; int y = cy + ( polyY [ ( bar + 4 ) % 6 ] + polyY [ ( bar + 5 ) % 6 ] ) * rank; // move by twice the distance of the midpoint of the next face each time int dx = polyX [ bar ] + polyX [ ( bar + 1 ) % 6 ]; int dy = polyY [ bar ] + polyY [ ( bar + 1 ) % 6 ]; for ( int hex = 0; hex < rank; ++hex ) { drawHex ( g, x, y, rank ); x += dx; y += dy; } } } 

Полный пример:

 import javax.swing.*; import java.awt.*; public class Hexagons { public static void main ( String...args ) throws Exception { SwingUtilities.invokeAndWait ( new Runnable () { @Override public void run () { new Hexagons().run(); } } ); } Hexagons () { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE ); final JPanel panel = new JPanel () { @Override public void paintComponent ( Graphics g ) { Graphics2D g2D = ( Graphics2D ) g; g2D.setRenderingHint ( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); drawHexes ( g2D, getWidth() / 2, getHeight() / 2 ); } }; count = 5; frame.add ( panel ); frame.setSize ( 400, 400 ); frame.setVisible ( true ); } void run () { } int count; void drawHexes ( Graphics2D g, int cx, int cy ) { int count = Math.min ( 20, Math.min ( cx, cy ) / 34 ); drawHex ( g, cx, cy, 0 ); for ( int rank = 1; rank < count; ++rank ) { for ( int bar = 0; bar < 6; ++bar ) { int x = ( polyX [ ( bar + 4 ) % 6 ] + polyX [ ( bar + 5 ) % 6 ] ) * rank; int y = ( polyY [ ( bar + 4 ) % 6 ] + polyY [ ( bar + 5 ) % 6 ] ) * rank; int dx = polyX [ bar ] + polyX [ ( bar + 1 ) % 6 ]; int dy = polyY [ bar ] + polyY [ ( bar + 1 ) % 6 ]; for ( int hex = 0; hex < rank; ++hex ) { drawHex ( g, cx + x, cy + y, rank ); x += dx; y += dy; } } } } static int polyX[] = { 20, 10, -10, -20, -10, 10 }; static int polyY[] = { 0, 17, 17, 0, -17, -17 }; static Color fill[] = new Color[20]; static Color line[] = new Color[20]; static BasicStroke stroke = new BasicStroke ( 1.5f ); // make it pretty static { for ( int rank = 0; rank < 20; ++rank ) { double theta0 = rank * 2 * Math.PI / 20; double theta1 = theta0 + Math.PI * 2.0/3.0; double theta2 = theta1 + Math.PI * 2.0/3.0; fill [ rank ] = new Color ( ( int ) ( 128 + 64 * Math.sin ( theta0 ) ), ( int ) ( 128 + 64 * Math.sin ( theta1 ) ), ( int ) ( 128 + 64 * Math.sin ( theta2 ) ) ); line [ rank ] = new Color ( ( int ) ( 64+ 32 * Math.sin ( theta0 ) ), ( int ) ( 64 + 32 * Math.sin ( theta1 ) ), ( int ) ( 64+ 32 * Math.sin ( theta2 ) ) ); } } void drawHex ( Graphics2D g, int cx, int cy, int rank ) { g.translate ( cx, cy ); g.setPaint ( fill [ rank ] ); g.fillPolygon ( polyX, polyY, 6 ); g.setColor ( line [ rank ] ); g.setStroke ( stroke ); g.drawPolygon ( polyX, polyY, 6 ); g.translate ( -cx, -cy ); } } 

Вы можете получить вдохновение от апплета карты гексагональной плитки Сергея Маленкова.