创建10.000连接的六角形页面? [英] creating 10.000 connected hexagon page?

查看:97
本文介绍了创建10.000连接的六角形页面?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建10.000六边形互相连接像蜜蜂combs.I想要创建所有这些作为一个元素后,我可以导入一些东西到里面他们。但是为了将六边形连接在一起,我的算法卡住后连接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);
a.x = a.x +(int)Math.round(105 * Math.cos(v));
a.y = a.y +(int)Math.round(105 * Math.sin(v));

pentagonList.add(pent);

这是我的五角大楼课程

  import javax.swing。*; 
import java.awt。*;
import java.awt.event。*;

/ **
*
* @author Meko
* /
public class pentagon extends JPanel {

private int n,r;
私人双角度;
public int [] x,y;


点c;
int posX,posY;

public pentagon(int pieces,int radie,Point center){

c = center;
n =件;
r = radie;
x = new int [n];
y = new int [n];
angle = 2 * Math.PI / n;

posX = c.x + 1024/2;
posY = c.y + 1024/2;

$ b $ 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);


}

}

$ b $创建一个矩形网格是相当明显的 - 只是倾斜一个矩形网格(要么倾斜它,并得到一个平行四边形,然后使用模数来包装它,或歪斜交替的行/列创建一个矩形网格)。

创建一个填充六角形的六边形相当容易


  • 在第 n 个排名中,有6个 n

  • 因此,如果你有x& b的话,那么你可以使用这个x& b。b
    y坐标在两个数组中, polyX polyY ,您得到一个嵌套循环:

      drawHex(g,cx,cy,0); (int bar = 0; bar <6; ++ bar){bb 
    $ b(int rank = 1; rank

    // x和y是前一张脸的两倍中点*等级离开
    //从中心
    int x = cx +(polyX [(bar + 4)%6] + polyX [(bar + 5)%6])* rank;
    int y = cy +(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 drawHex(g,x,y,rank);
    x + = dx;
    y + = dy;



    code
    $ b $ hr

    完整示例:

      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(){}
    $ b $ 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); (int bar = 0; bar <6; ++ bar){bb
    $ b(int rank = 1; rank

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

    //使它变得相当美元
    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)));


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


    I am trying to create 10.000 hexagon connected each other like bee combs.I want to create all of this as a element that after I can import some thing to inside them.But for connecting hexagons together my algorithms stuck after connecting first 6 elements. Here is my algorithm in java. I made in java for testing . And inaddition I want to make them size smaller from before connected.

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

    and this is my pentagon 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 = c.x + 1024 / 2;
            posY = c.y + 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);
    
    
        }
    

    }

    解决方案

    Creating a rectangular grid is fairly obvious - just skew a rectangular grid ( either skew it all and get a parallelogram, then use modulo to wrap it, or skew alternate rows/columns to create a rectangular grid ).

    Creating a hexagon filled with hexagons is fairly easy too

    • in the n th rank, there are 6 bars of n hexes
    • the centres of adjacent hexes are displaced twice the distance of the midpoint of one of the faces to the centre

    So if you have the x & y co-ordinates of your hexes in two arrays, polyX and polyY, you get a nested loop:

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


    Full example:

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

    这篇关于创建10.000连接的六角形页面?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆