package AstroUI; import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.util.GregorianCalendar; import AstroOL.Calculator; import AstroOL.Degree; /** Applet zur schnellen Übersicht über die dirigierten conversen und direkten Achsen. */ public class AnglesDirections extends Applet implements AdjustmentListener, ActionListener, ItemListener { // Bestandteile der Benutzerschnittstelle erzeugen Scrollbar horiz=new Scrollbar(Scrollbar.HORIZONTAL,0,0,-120,121); Component[] num = new Component[20]; Component[] kJahr = new Component[20]; Label[] ramcP = new Label[20]; Label[] mc = new Label[20]; Label[] asc = new Label[20]; Label delta = new Label("0°"); Label ramcD = new Label("RAMC d."); Label mcD = new Label("MC d."); Label ascD = new Label("ASC d."); Label alterLabel = new Label("Alter"); Label jahrLabel = new Label("Jahr"); Label keyLabel = new Label("Direktionsschlüssel"); Label ramcNeu = new Label("16.15.55"); TextField ramc = new TextField("16.15.55"); TextField phi = new TextField("50°"); TextField eps = new TextField("23°26'"); Button resetButton = new Button("C"); Button conversButton = new Button("convers"); Button getButton = new Button(" RAMC übernehmen "); CheckboxGroup key = new CheckboxGroup(); Checkbox ptolemaeus = new Checkbox("Ptolemäus",true,key); Checkbox naibod = new Checkbox("Naibod",false,key); Checkbox cardano = new Checkbox("Cardano", false, key); double /** Direktionsschlüssel */ dirKey = 1d, /** t ist immer die oben eingegebene Sternzeit */ t = Degree.getValue(ramc.getText()), /** Abweichung neue ramcNeu - t */ dx = 0d, /** Ekliptikschiefe */ ee= Degree.getValue(eps.getText()), /** Fest berechnete Cosines- und Sinuswerte zur Schiefe */ cosEE = Calculator.cos(ee), sinEE = Calculator.sin(ee), /** Geographische Breite */ p=Degree.getValue(phi.getText()); /** Offset der Alter-Spalte */ int iStart = 0; /** Offset der Kalenderjahrspalte.<br> Default ist das aktuelle Kalenderjahr*/ int kStart = (new GregorianCalendar()).get(GregorianCalendar.YEAR); /** Converse Führung (umschaltbar) */ boolean convers = false; /** Das Applet konstruieren. */ public AnglesDirections() { double st; TextField fd; Color c = new Color((float)0.7,(float)0.7,(float)0.7); Color cIntensified = new Color(0f,.7f,.9f); for (int i = 0; i < 20; i++) { st = t + (double) i; // Anfangs ist t = 0 if (i == 0) { num[i] = new TextField(Integer.toString(i+iStart),5); kJahr[i] = new TextField(Integer.toString(i+kStart),5); } else { num[i] = new Label(Integer.toString(i+iStart)); kJahr[i] = new Label(Integer.toString(i+kStart)); } ramcP[i] = new Label(Degree.dms(st)); ramcP[i].setAlignment(Label.RIGHT); asc[i] = new Label(Degree.zodLength(aclaenge(st))); asc[i].setAlignment(Label.RIGHT); mc[i] = new Label(Degree.zodLength(mclaenge(st))); mc[i].setAlignment(Label.RIGHT); if ((i % 5) == 0) { if (i > 0) { kJahr[i].setBackground(cIntensified); num[i].setBackground(cIntensified); } asc[i].setBackground(cIntensified); ramcP[i].setBackground(cIntensified); mc[i].setBackground(cIntensified); } } ramcD.setAlignment(Label.CENTER); mcD.setAlignment(Label.CENTER); ascD.setAlignment(Label.CENTER); alterLabel.setAlignment(Label.CENTER); jahrLabel.setAlignment(Label.CENTER); keyLabel.setAlignment(Label.LEFT); fd = (TextField) num[0]; fd.addActionListener(this); fd = (TextField) kJahr[0]; fd.addActionListener(this); eps.addActionListener(this); phi.addActionListener(this); ramc.addActionListener(this); horiz.addAdjustmentListener(this); resetButton.addActionListener(this); conversButton.addActionListener(this); getButton.addActionListener(this); naibod.addItemListener(this); ptolemaeus.addItemListener(this); cardano.addItemListener(this); } /** Init()-Methode nach Konstruktion (bei erstmaligem Aufruf). Hier wird das UI erzeugt. */ public void init(){ this.setBackground( new Color(0f,.8f,1f) ); GridBagLayout gbl = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); this.setLayout(gbl); Panel c0a = new Panel(new GridLayout(4,3)); c0a.add(new Label("Ekliptikschiefe")); c0a.add(eps); c0a.add(new Label("")); c0a.add(new Label("Breite")); c0a.add(phi); c0a.add(new Label("")); c0a.add(new Label("RAMC")); c0a.add(ramc); c0a.add(new Label("")); c0a.add(new Label("RAMC neu")); c0a.add(ramcNeu); c0a.add(getButton); Panel c0b = new Panel(new GridLayout(4,1)); c0b.add(keyLabel); c0b.add(ptolemaeus); c0b.add(naibod); c0b.add(cardano); GridLayout gl0 = new GridLayout(1,2); gl0.setHgap(50); Panel c0 = new Panel(gl0); c0.add(c0a); c0.add(c0b); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.anchor = GridBagConstraints.WEST; gbc.weighty = 0.2; gbl.setConstraints(c0,gbc); add(c0); GridBagLayout gbl01 = new GridBagLayout(); GridBagConstraints gbc01 = new GridBagConstraints(); Panel c01 = new Panel(gbl01); gbc01.fill = GridBagConstraints.HORIZONTAL; gbc01.weightx = 0.9; gbc01.weighty = 1.; gbl01.setConstraints(horiz,gbc01); c01.add(horiz); gbc01.weightx = 0.1; gbl01.setConstraints(delta,gbc01); c01.add(delta); gbc01.weightx = 0.1; gbc01.gridwidth = GridBagConstraints.HORIZONTAL; gbl01.setConstraints(delta,gbc01); c01.add(resetButton); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 1.d; gbc.weighty = 0.05d; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(2,2,2,2); gbl.setConstraints(c01,gbc); add(c01); Panel c1 = new Panel(new GridLayout(22,5)); c1.add(alterLabel); c1.add(jahrLabel); c1.add(ramcD); c1.add(mcD); c1.add(ascD); for (int i=0; i<20; i++) { c1.add(num[i]); c1.add(kJahr[i]); c1.add(ramcP[i]); c1.add(mc[i]); c1.add(asc[i]); } c1.add(new Label("")); c1.add(new Label("")); c1.add(conversButton); c1.add(new Label("")); c1.add(new Label("")); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weighty = 0.9; gbl.setConstraints(c1,gbc); add(c1); } /** Event Handler für Änderungen des Rollbalkens ( = Feinjustierung der Sternzeit ). RAMC und Differenz von zuletzt eingegebener RAMC müssen neu gesetzt werden, darüberhinaus alle sichtbaren Jahreszeilen. */ public void adjustmentValueChanged(AdjustmentEvent e){ double st; if(e.getAdjustable()==horiz){ dx = ((double) horiz.getValue())/60d; delta.setText(Degree.dms(dx)); ramcNeu.setText(Degree.dms(t+dx)); } refreshItems(); } /** Event Handler für Buttons ("Zurücksetzen", "Convers/Direkt umschalten" und "RAMC übernehmen" */ public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(resetButton.getLabel())) { horiz.setValue(0);} else if (e.getActionCommand().equals("convers") || e.getActionCommand().equals("direkt")) { convers = !convers; ramcD.setText(convers? "RAMC c." : "RAMC d."); ascD.setText(convers? "ASC c." : "ASC d."); mcD.setText(convers? "MC c." : "MC d."); conversButton.setLabel(convers?"direkt":"convers"); } else if (e.getActionCommand().equals(getButton.getLabel())) { t = t + dx; ramc.setText(Degree.dms(t)); dx = 0; horiz.setValue(0); } refresh(); } /** Event Handler für Radiobuttonwechsel (Ptolemäus, Naibod, Cardano) */ public void itemStateChanged(ItemEvent e) { if (ptolemaeus.getState()) dirKey = 1d; else if (naibod.getState()) dirKey = 0.9856473d; else dirKey = 0.9863014d; refreshItems(); } private void refresh() { double st,tOld; int iOld = iStart; tOld = t; // Sternzeit oder RAMC abholen String ramcText = ramc.getText().toLowerCase(); t = Degree.getValue(ramcText); // Angaben im hms-System umwandeln if (ramcText.indexOf('h')>=0)t *= 15; else if (ramcText.indexOf('m')>=0)t *= 15*60; else if (ramcText.indexOf('s')>=0)t *= 15*60*60; if (t != tOld) horiz.setValue(0); dx = ((double) horiz.getValue())/60d; ramc.setText(Degree.dms(t)); ee= Degree.getValue(eps.getText()); eps.setText(Degree.dms(ee)); setEE(ee); p=Degree.getValue(phi.getText()); phi.setText(Degree.dms(p)); delta.setText(Degree.dms(dx)); ramcNeu.setText(Degree.dms(t+dx)); try { iStart = Integer.parseInt(((TextField)num[0]).getText()); kStart = Integer.parseInt(((TextField)kJahr[0]).getText()); } catch (java.lang.NumberFormatException ex){}; if (iStart != iOld) kStart += iStart-iOld; refreshItems(); } private void refreshItems() { double st; TextField fd; Label lb; for (int i=0;i<20;i++) { if (i == 0) { ((TextField)num[i]).setText(Integer.toString(i+iStart)); ((TextField)kJahr[i]).setText(Integer.toString(i+kStart)); } else { ((Label)num[i]).setText(Integer.toString(i+iStart)); ((Label)kJahr[i]).setText(Integer.toString(i+kStart)); } st = (convers?-1:1)*(double)(i + iStart)*dirKey + t + dx; if ((st < 0) || (st > 360)) st = (st/360-Math.floor(st/360))*360; ramcP[i].setText(Degree.dms(st)); asc[i].setText(Degree.zodLength(aclaenge(st))); mc[i].setText(Degree.zodLength(mclaenge(st))); } } /** Länge des MC aus Sternzeit, in Grad aufbereitet */ double mclaenge(double t) { return Calculator.fmod360(Math.atan2(Math.sin(t*Calculator.toRad),cosEE*Math.cos(t*Calculator.toRad))*Calculator.toDeg); } /** Länge des ASC aus Sternzeit, in Grad aufbereitet */ double aclaenge(double t) { return Calculator.fmod360(Math.atan2(Math.sin((t+90d)*Calculator.toRad),cosEE*Math.cos((t+90d)*Calculator.toRad)- sinEE*Math.tan(p*Calculator.toRad))/Calculator.toRad); } /** Ekliptikschiefe setzen. Cos und Sin der Ekliptikschiefe werden neu berechnet. */ void setEE(double eeIn) { ee = eeIn; cosEE = Calculator.cos(ee); sinEE = Calculator.sin(ee); } /** Die ersten 26 Zeilen als reinen Text für den Druck aufbereiten. Es wird ein String zurückgegeben, der die komplette zu druckende Seite enthält. */ public String getList() { int alter, jahr; double st; boolean lConvers = true; StringBuffer x = new StringBuffer(); String endLine= "+----+------+------------+--------------+--------------+------------+--------------+--------------+\n"; String labels= "| A. | Jahr | RAMC d. | ASC direkt | MC direkt | RAMC c. | ASC convers | MC convers |\n"; x.append("================================== P R I M Ä R E A C H S E N =====================================\n"); x.append("\n\nRAMC : " + Degree.dms(t)); x.append("\nGeographische Breite : " + Degree.dms(p)); x.append("\nDirektionsschlüssel : " + Degree.dms(dirKey)); x.append("\nSchiefe der Ekliptik : " + Degree.dms(ee)+"\n\n"); x.append(endLine); x.append(labels); x.append(endLine); for (int i=0;i<26;i++) { if (i > 0) x.append('\n'); if ((i > 0) && ((i%10)==0)) x.append(endLine); x.append( "| " ); if ((i+iStart) < 10) x.append(' '); x.append(Integer.toString(i+iStart)); x.append(" | "); x.append(Integer.toString(i+kStart)); x.append(" |"); do { lConvers = !lConvers; st = (lConvers?-1:1)*(double)(i + iStart)*dirKey + t; if ((st < 0) || (st > 360)) st = (st/360-Math.floor(st/360))*360; x.append(Degree.dms(st)); x.append(" |"); x.append(Degree.zodLength(aclaenge(st))); x.append(" |"); x.append(Degree.zodLength(mclaenge(st))); x.append(" |"); } while (!lConvers); } x.append('\n'); x.append(endLine); return x.toString(); } }