Klassen des Pakets AstroUI: Zur Doku-Startseite Zurück zur Homepage

Klasse AnglesDirections

Javadoc von AnglesDirections   AnglesDirections.java herunterladen

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 &Auml; 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&uumlssel  : " + 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();
  }


}



Zum Seitenanfang Lizenzbedingungen Der Quellcode wird mit dem GNU source-highlight 1.7 dargestellt