Gwiazda Izydy (Gwiazda Ishtar)

Dobry opis można przeczytać na Wikipedii.
Byłby bardzo dobry, gdyby nie fakt, że autor nie bardzo rozumiał jak ruch Wenus i Ziemi tworzą pentagram:

“Według niektórych źródeł już w prehistorii zaobserwowano, że planeta Wenus wykonuje na nieboskłonie pentagram w ciągu 8 lat[…]. Ruch planety na sferze niebieskiej odtwarza zmiany nachylenia ekliptyki względem horyzontu, a brak współmierności między długością roku ziemskiego i okresem obiegu Słońca przez Wenus nie umożliwia jednak uzyskania nawet toru o kształcie gwiazdy czteropromiennej. W bardzo długim czasie kolejne efemerydy planety wyznaczają dwa wycinki koła o takich samych kątach wierzchołkowych. Tor gwiazdy pięciopromiennej jest również niemożliwy, gdyż planeta nigdy nie porusza się po sferze niebieskiej w kierunku zenitu, a wyłącznie w pobliżu ekliptyki. Tego szczegółu trajektorii nie odtworzyłoby także uwzględnienie nachylenia płaszczyzny orbity planety do płaszczyzny ekliptyki.

Aby to objaśnić napisałam animację pokazująca ruch Ziemi i Wenus dookoła Słońca oraz ich spotkania na linii ze Słońcem, nazywane koniunkcjami dolnymi. Koniunkcje są górne, gdy Wenus i Ziemia są w linii ze Słońcem, ale po przeciwnych stronach Słońca. Gdy miejsca koniunkcji dolnych (albo górnych) połączymy liniami, otrzymamy kształt pentagramu, nazywany Gwiazdą Izydy albo Gwiazdą Isztar.
Dzięki temu, że punkt 1 i 6 nie pokrywają się, gwiazda stopniowo rotuje.

Klasa GwiazdaIzydy
package wenus;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import javax.imageio.*;
import javax.swing.*;
public class GwiazdaIzydy {
    private static final long serialVersionUID = -3293133848695030716L;
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Koniunkcje dolne Wenus");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new AnimPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}
class AnimPanel extends JPanel implements ActionListener {
    private static final long serialVersionUID = -7557309579087167870L;
    private double angleZ = Math.toRadians(180.0);
    private double angleW = Math.toRadians(180.0);
    private final Plansza plansza;
    private final Wenus wenus;
    private final Ziemia ziemia;
    private final Timer timer;
    private final JButton button;
    private boolean bool;
    public AnimPanel() {
        bool = true;
        setLayout(null);
        setPreferredSize(new Dimension(452, 452));
        setBounds(0, 0, 452, 452);
        setBackground(Color.WHITE);
        plansza = new Plansza();
        ziemia = new Ziemia();
        ziemia.setLocation(10, 200);
        wenus = new Wenus();
        wenus.setLocation(54, 202);
        add(ziemia);
        add(wenus);
        add(plansza);
        timer = new Timer(25, this);
        button = new JButton();
        button.setBounds(375, 5, 70, 20);
        button.setText("Start");
        add(button);
        button.addActionListener(e -> {
            if (bool) {
                bool = false;
                timer.start();
                angleZ = Math.toRadians(180.0);
                angleW = Math.toRadians(180.0);
                button.setText("Stop");
                plansza.eraseDigits();
            } else {
                bool = true;
                timer.stop();
                button.setText("Start");
            }
        });
        //timer.start();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        int CENTER_X = 226;
        int xz = CENTER_X + (int) (Math.cos(angleZ) * 200);
        int CENTER_Y = 226;
        int yz = CENTER_Y + (int) (Math.sin(angleZ) * 200);
        ziemia.setLocation(xz - 15, yz - 15);
        double angleChangeZ = -3.0;
        angleZ += Math.toRadians(angleChangeZ);
        //-
        int xw = CENTER_X + (int) (Math.cos(angleW) * 158);
        int yw = CENTER_Y + (int) (Math.sin(angleW) * 158);
        wenus.setLocation(xw - 12, yw - 12);
        double angleChangeW = angleChangeZ * 1.625;
        angleW += Math.toRadians(angleChangeW);
        if (Math.toDegrees(angleZ) <= -2710) {
            timer.stop();
            bool = true;
            button.setText("Start");
        }
        if (Math.toDegrees(angleZ) <= -2700) {
            plansza.setDigits(6);
        }
        if (Math.toDegrees(angleZ) <= -2124) {
            plansza.setDigits(5);
        }
        if (Math.toDegrees(angleZ) <= -1548) {
            plansza.setDigits(4);
        }
        if (Math.toDegrees(angleZ) <= -972) {
            plansza.setDigits(3);
        }
        if (Math.toDegrees(angleZ) <= -396) {
            plansza.setDigits(2);
        }
        if (Math.toDegrees(angleZ) < 180) {
            plansza.setDigits(1);
        }
    }
}
class Plansza extends JComponent {
    private static final long serialVersionUID = 5047877456045895256L;
    private static final Color color = new Color(225, 0, 0);
    private static final Font font = new Font("Dialog", Font.BOLD, 14);
    private BufferedImage plansza;
    private boolean jedynka, dwojka, trojka, czworka, piatka, szostka = false;
    public Plansza() {
        setLayout(null);
        setPreferredSize(new Dimension(452, 452));
        setBounds(0, 0, 452, 452);
        URL url_plansza = getClass().getClassLoader().getResource(
                "assets/startcircle.png");
        try {
            plansza = ImageIO.read(url_plansza);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setDigits(int digit) {
        switch (digit) {
            case 6:
                szostka = true;
            case 5:
                piatka = true;
            case 4:
                czworka = true;
            case 3:
                trojka = true;
            case 2:
                dwojka = true;
            case 1:
                jedynka = true;
                repaint();
                break;
        }
    }
    public void eraseDigits() {
        szostka = false;
        piatka = false;
        czworka = false;
        trojka = false;
        dwojka = false;
        jedynka = false;
        repaint();
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawImage(plansza, 25, 25, 402, 402, this);
        g2.setColor(color);
        g2.setFont(font);
        g2.setStroke(new BasicStroke(1.5f));
        if (jedynka) {
            g2.drawString("1", 60, 228);//
        }
        if (dwojka) {
            g2.drawString("2", 365, 150);//
            g2.drawLine(70, 223, 360, 149);//
        }
        if (trojka) {
            g2.drawString("3", 164, 385);//
            g2.drawLine(360, 149, 168, 370);//
        }
        if (czworka) {
            g2.drawString("4", 200, 68);//
            g2.drawLine(168, 370, 206, 72);//
        }
        if (piatka) {
            g2.drawString("5", 342, 345);
            g2.drawLine(206, 72, 340, 333);//
        }
        if (szostka) {
            g2.drawString("6", 60, 213);//
            g2.drawLine(340, 333, 71, 210);//
        }
    }
}
class Wenus extends JComponent {
    private static final long serialVersionUID = 8378878992801370265L;
    private BufferedImage wenus;
    public Wenus() {
        setLayout(null);
        setPreferredSize(new Dimension(24, 24));
        setBounds(0, 0, 24, 24);
        setBackground(Color.WHITE);
        URL url_wenus = getClass().getClassLoader().getResource(
                "assets/wenus.png");
        try {
            wenus = ImageIO.read(url_wenus);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawImage(wenus, 0, 0, 24, 24, null);
    }
}
class Ziemia extends JComponent {
    private static final long serialVersionUID = 5464955575397485167L;
    private BufferedImage ziemia;
    public Ziemia() {
        setLayout(null);
        setPreferredSize(new Dimension(30, 30));
        setBounds(0, 0, 30, 30);
        setBackground(Color.WHITE);
        URL url_ziemia = getClass().getClassLoader().getResource(
                "assets/ziemia.png");
        try {
            ziemia = ImageIO.read(url_ziemia);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawImage(ziemia, 0, 0, 30, 30, null);
    }
}
Wynik

Po uruchomieniu i kliknięciu przycisku Start uruchamiamy animację nagraną na poniższym filmiku.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *