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.