Ungenaue Werte bei Math.atan

thirty7

Mitglied
Hallo!
Mein Problem ist, dass ich bei der Berechnung eines Arcustangens umgerechnet in degrees zum Teil extrem ungenaue Werte als Lösung bekomme(z.B.: Math.toDegrees(Math.atan(5/7)= 45°).
Ich benötige diese Winkel in einem Programm, dass für einen Fluss, der mit w fließt & x breit ist ,ein Boot, das y schnell fährt, einen Zielpunkt, der um z meter vom Startpunkt verschoben ist, alle benötigten Werte errechnet. Ich habe Scrollleisten zum verändern der Werte hinzugefügt, bei einer Veränderung werden die Werte dann neu errechnet. Auffällig ist, dass beim berechnen des Arcustangens von (Abstand/Flussbreite) genaue Werte errechnet werden, wenn das Ergebnis von Abstand/Flussbreite möglichst klein ist. Ich denke ich bin nur über einen Anfängerfehler gestolpert und Ihr könnt mir weiterhelfen. 🙂
Bei Fragen fragt gerne.

thirty7
 
Ich erhalte bei deinen genannten Wert ~35.5 und keine 45°.

Beachte, dass 5/7=0 wenn du mit Integern rechnest (Nachkommastellen werden abgeschnitten).
 
Ich erhalte im Taschenrechner natürlich auch den Wert 35.538. Aber meine Anzeige gib mir 45 aus.
Und nein, ich rechne mit double. Bei Zahlen wie 1/20 kommt auch ein extrem genauer Wert mit ca. 10 Nachkommastellen heraus.

Aber trotzdem Danke für die Tipps!
 
Java:
import java.applet.Applet;
import java.awt.*;


public class fluss3 extends Applet{
    
    double flussbreite=7,punktc=5;
    double alpha;
    public void init(){}
    public void paint(Graphics g){
        alpha = Math.toDegrees(Math.atan(punktc/flussbreite)); 
        g.drawString("alpha"+alpha,100,100);

    }
}
Das gibt bei mir auch den richtigen Wert aus.
Nur Wenn ich alles in mein Applet mit Schiebereglern einsetzte, kommen Teilweise falsche Werte, wie schon oben gesagt, nicht immer! Hilft es wenn ich den gesamten Code poste?
 
Okay. Habe direkt mal das Applet auf nen Server geladen, damit mans sich anschaun kann was ich genau meine. Hier der Link
Hier ist mein gesamter Code, auch ohne weiteres kompilierbar:
Java:
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;

public class fluss2 extends Applet implements AdjustmentListener
{
    Scrollbar slider1;
    Scrollbar slider2;
    Scrollbar slider3;
    Scrollbar slider4;
    //Werte
    int vboot=1,vfluss=1,flussbreite=1,punktc=1;
    double alpha,beta,gamma,delta,epsilon;
    double strecke,vres,tres;
    double hilfe1,hilfe2,hilfe3,hilfe4;
    
    public void init() {
        // slider-Objekt erstellen
        slider1 = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 1, 20);
        slider2 = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 1, 20);
        slider3 = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 1, 200);
        slider4 = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 1, 100);        
        // slider zum applet hinzufügen
        add(slider1);
        add(slider2);
        add(slider3);
        add(slider4);
        // slider als Listener hinzufügen
        slider1.addAdjustmentListener(this);
        slider2.addAdjustmentListener(this);
        slider3.addAdjustmentListener(this);
        slider4.addAdjustmentListener(this);
    } 
    
    public void paint( Graphics g ) {
        //ausgabe zeichnen
        g.drawRect(0, 100, 800, flussbreite*2);
        g.drawLine(400,100,400,flussbreite*2+100);
        g.drawLine(400,flussbreite*2+100,400+punktc,100);
        
        
        //ausgabe schreiben
        g.setColor(Color.black);
        g.drawString( "Vboot = " + vboot, 20, 20 );
        g.drawString( "Vfluss = " + vfluss, 20,40);
        g.drawString( "Flussbreite = "+flussbreite,20,60);
        g.drawString( "Punkt C = " +punktc,20,80);
        g.drawString( "Alpha = " +alpha +"°",80,20);
    } 
    
    public void adjustmentValueChanged(AdjustmentEvent e) {
        // record the value of the slider
        vboot = slider1.getValue();
        vfluss = slider2.getValue();
        flussbreite = slider3.getValue();
        punktc = slider4.getValue();
        hilfe1=punktc/flussbreite;
        alpha=Math.toDegrees(Math.atan(hilfe1));
        repaint();
    }
   }
Danke für eure Hilfe 🙂
 
Wie oben bereits erwähnt teilst du hier int/int, und das ergibt zwangsläufig wieder nen int.
 
Achso, ich dachte wenn ich den andren Wert als double mache gehts. Blöder Fehler, habs grade geändert, läuft jetzt Einwandfrei 🙂 Danke für die schnelle Hilfe, auch wenn ich mich ein wenig blöd angestellt hab.

thirty7
 

Zurück
Oben