Zielony Smok - logo witryny

Animowany symbol JinJang (YinYang)

Jak narysować symbol JinJang (YinYang) pokazałam w tym wpisie.

Symbol można animować.

Klasy

JinJangAnim.java
package jinjang2;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;

public class JinJangAnim extends JPanel {
    private static final long serialVersionUID = -3120426206998247799L;
    private final double rozmiar;
    private final double odstep;
    private final Color color1;
    private final Color color2;
    private double kat = 0.0;

    /**
     * Tworzy obiekt typu JinJang
     *
     * @param rozmiar double - srednica figury
     * @param odstep  double - odległość figury od lewego i górnego
     *                brzegu komponentu
     * @param color1  Color - kolor lewej strony. Jeśli nie jest podany
     *                to kolot jest biały
     * @param color2  Color - color prawej strony. Jeśli jest nie podany to kolor
     *                jest czarny;
     */
    public JinJangAnim(double rozmiar, double odstep, Color color1,
                       Color color2) {
        this.rozmiar = rozmiar;
        this.odstep = odstep;
        if (color1 == null) {
            this.color1 = Color.WHITE;
        } else {
            this.color1 = color1;
        }
        if (color2 == null) {
            this.color2 = Color.BLACK;
        } else {
            this.color2 = color2;
        }
        this.setBounds(0, 0, (int) odstep + (int) rozmiar,
                (int) odstep + (int) rozmiar);
    }

    @Override
    public void paintComponent(Graphics g) {
        AffineTransform at = AffineTransform.getRotateInstance(kat,
                getWidth() / 2, getHeight() / 2);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setTransform(at);
        //-
        Arc2D.Double polkoleLewe = new Arc2D.Double(odstep, odstep, rozmiar,
                rozmiar, 90, 180, Arc2D.OPEN);
        g2.setColor(color1);
        g2.fill(polkoleLewe);
        //
        Arc2D.Double polkolePrawe = new Arc2D.Double(odstep, odstep, rozmiar,
                rozmiar, -90, 180, Arc2D.OPEN);
        g2.setColor(color2);
        g2.fill(polkolePrawe);
        // -
        Ellipse2D.Double koloGorne = new Ellipse2D.Double(
                rozmiar / 4.0 + odstep, odstep, rozmiar / 2.0, rozmiar / 2.0);
        g2.setColor(color1);
        g2.fill(koloGorne);
        // -
        Ellipse2D.Double koloDolne = new Ellipse2D.Double(
                rozmiar / 4.0 + odstep, rozmiar / 2.0 + odstep, rozmiar / 2.0,
                rozmiar / 2.0);
        g2.setColor(color2);
        g2.fill(koloDolne);
        // -
        Ellipse2D.Double kolkoGorne = new Ellipse2D.Double(
                rozmiar / 2.0 + odstep, rozmiar / 4.0 + odstep, rozmiar / 20.0,
                rozmiar / 20.0);
        g2.setColor(color2);
        g2.fill(kolkoGorne);
        // -
        // -
        Ellipse2D.Double kolkoDolne = new Ellipse2D.Double(
                rozmiar / 2.0 + odstep, rozmiar / 2.0 + rozmiar / 4.0 + odstep,
                rozmiar / 20.0, rozmiar / 20.0);
        g2.setColor(color1);
        g2.fill(kolkoDolne);
        double katStep = (Math.PI * 2) / 360;
        kat += katStep;
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        repaint();
    }
}
Main.java
package jinjang2;

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

public class Main extends JFrame {
    private static final long serialVersionUID = 4648172894076113183L;
    private static final int FRAME_WIDTH = 550;
    private static final int FRAME_HEIGHT = 460;
    private static final Color PLANSZA = new Color(102, 204, 204);

    public Main() {
        setLayout(null);
        int frameY = Toolkit.getDefaultToolkit().getScreenSize().height / 2
                - FRAME_HEIGHT / 2;
        int frameX = Toolkit.getDefaultToolkit().getScreenSize().width / 2
                - FRAME_WIDTH / 2;
        setBounds(frameX, frameY, FRAME_WIDTH, FRAME_HEIGHT);
        getContentPane().setBackground(PLANSZA);
        JinJangAnim jjanim = new JinJangAnim(170, 0, Color.WHITE, Color.BLACK);
        jjanim.setLocation(170, 100);
        add(jjanim);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Symbol JinJang");
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Main::new);
    }
}

Wynik

Po uruchomieniu klasy Main.java zobaczymy symbol JinJang (YinYang) obracający się w prawo.