如何使用单个/简单的for循环以不同的比例和平移多次绘制蝶形曲线?

时间:2018-11-30 14:18:46

标签: java 2d graphics2d java-2d

这个问题与my older question有关。

我想做的是将同一条蝶形曲线绘制多达30次。每次使用随机的比例/翻译/颜色。

我尝试了以下代码:

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    for (int j=0;j<30;j++) {

        double tr = Math.random() * 300;
        g2.translate(tr,tr);
        double sc = Math.random() * 50 + 10;
        g2.scale(sc,sc);
        g2.setStroke(new BasicStroke(0.01f ));
        g2.setColor(new Color((int)(Math.random()*255), (int)(Math.random()*255),(int) (Math.random()*255)));
        double x1,y1;
        double x0 = 0;
        int nPoints = 1500;
        double y0 = Math.E-2;

        for(int i=0;i<nPoints;i++) {
            double t= 12*i*Math.PI/nPoints;
            x1=(Math.sin(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
            y1 = (Math.cos(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
            g2.draw(new Line2D.Double(x0,y0,x1,y1));
            x0=x1;
            y0=y1;
        }
    }
}

此代码的问题是,最后,它将仅显示/绘制一条曲线。它不会显示多个。由于在Swing中绘画是破坏性的,因此我怀疑我面临的问题与这些行位于for循环内有关:

double tr = Math.random() * 300;
g2.translate(tr,tr);
double sc = Math.random() * 50 + 10;
g2.scale(sc,sc);

为了进行快速测试,我尝试了以下代码:

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D)g;
    double tr = Math.random() * 300;
    g2.translate(tr,tr);
    double sc = Math.random() * 50 + 10;
    g2.scale(sc,sc);

    for (int j=0;j<30;j++) {
        g2.setStroke(new BasicStroke(0.01f ));
        g2.setColor(new Color((int)(Math.random()*255), (int)(Math.random()*255),(int) (Math.random()*255)));
        double x1,y1;
        double x0 = 0;
        int nPoints = 1500;
        double y0 = Math.E-2;
        g2.drawLine(5,j,100,j);
    }
}

这画了30行,当我在循环中添加scaletranslate方法时,它只画了1行。 所以我想我是对的

一个简单的for循环可以完成这项工作吗?还是我应该使用一种更复杂的算法来在更改比例和平移时多次绘制该蝶形曲线?

1 个答案:

答案 0 :(得分:0)

我找到了使用AffineTransform进行缩放和翻译的解决方案。

基本上,解决方案是摆脱g2.scaleg2.translate,而使用g2.setTransform(tx);txAffineTransform,可以缩放和平移。

这是为我做的代码:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    for (int j=0;j<30;j++) {
        double sc = Math.random() * 30 + 10;
        AffineTransform tx = new AffineTransform();
        tx.scale(sc, sc);
        tx.translate(Math.random() * 50, Math.random() * 50);
        g2.setTransform(tx);
        g2.setStroke(new BasicStroke(0.01f ));
        g2.setColor(new Color((int)(Math.random()*255), (int)(Math.random()*255),(int) (Math.random()*255)));
        double x1,y1;
        double x0 = 0;
        int nPoints = 1500;
        double y0 = Math.E-2;

        for(int i=0;i<nPoints;i++) {
            double t= 12*i*Math.PI/nPoints;
            x1=(Math.sin(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
            y1 = (Math.cos(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
            g2.draw(new Line2D.Double(x0,y0,x1,y1));
            x0=x1;
            y0=y1;
        }
    }
}

Butterfly Images