Как нарисовать кривую бабочка несколько раз с разным масштабом и переводом, используя один / простой цикл for? - PullRequest
0 голосов
/ 30 ноября 2018

Этот вопрос связан с моим старым вопросом .

Я пытаюсь нарисовать ту же самую кривую бабочки до 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 строк, и когда я добавил методы scale и translate внутри цикла, он нарисовал только 1 линию. Так что я думаю, что я прав .

Может ли простой цикл for выполнить эту работу, или мне следует использовать более сложный алгоритм для многократного рисования кривой бабочки?при изменении масштаба и перевода?

1 Ответ

0 голосов
/ 30 ноября 2018

Я нашел решение, используя AffineTransform для масштабирования и перевода.

В основном решение заключалось в том, чтобы избавиться от g2.scale и g2.translate и использовать g2.setTransform(tx);.tx - это AffineTransform, который масштабируется и переводится.

Вот код, который сделал это для меня:

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

...