Konvertierungsversuch: that mesmerizing thing in ~18 lines of "pure" javascript

sirbender

Top Contributor
Ich wollte folgendes Javascript Beispiel konvertieren:

https://www.reddit.com/r/programming/comments/3hpnhv/that_mesmerizing_thing_in_18_lines_of_pure/

So sieht es aus: https://jsfiddle.net/gg19b2do/101/

Mein bisheriges Ergebnis funktioniert nicht ganz deckungsgleich. Erstmal rotiert die Javascript-Methode bei positiven Winkel-Werten im Uhrzeigersinn. Java's drawArc im Gegenuhrzeigersinn. Das koennte man durch vorgestelltem Minuszeichen fixen, aber das Ergebnis sieht noch nicht 100% aus.

Vielleicht hat jemand von Euch eine Idee?

Java:
package experiment;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class EighteenLines extends JPanel {
    double pos=0;
    double pinc= 0.25;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
       
        Graphics2D ctx = (Graphics2D) g;
        ctx.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        ctx.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        ctx.setColor(Color.white);
        ctx.fillRect(0, 0, this.getWidth(), this.getHeight());
       
        ctx.setColor(Color.black);
        ctx.setStroke(new BasicStroke(8));
        for (int x = 0; x < 10; x++) {
            int r = x * 10 + 4;
            double st = ((pos * (x+1)) % 200)/100;
            double et = (st + 1) % 2;
            ctx.drawArc(100 - r, 100 - r, r * 2, r * 2, (int)(et * 180), ((int)(st * 180)));
            pos = (pos + pinc) % 200;
        }
        pinc = .7 * ((100 - (Math.abs(100 - pos))) / 100);
        if (pinc < .01) pinc = .01;
    }
   
   
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setContentPane(new EighteenLines());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public EighteenLines() {
        int n = 200;
        this.setSize(new Dimension(n ,n));
        this.setPreferredSize(new Dimension(n ,n));
       
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                EighteenLines.this.repaint();
            }
        };
        Timer timer = new Timer(0, taskPerformer);
        timer.setDelay(100);
        timer.start();
    }
}
 

Oben