# Sin, Cos, Tangens



## Hollow (17. Jul 2008)

Moin  

Also ich hab ein bisserl Probleme mit dem Math-Paket. Ich würd gern in einem Koordinatensystem mit einer
definierten Schrittweite von einem Punkt a zu einem Punkt b wandern. Und weil das ganze ja prinzipiell nur
ein wenig Dreiecksberechnung sein sollte dacht ich mir das ganze so:

```
package de; 

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Runner extends JFrame { 
	
   public static void main(String[] args) { 
      new Runner().setVisible(true); 
   } 
    
   public Runner() { 
	   super();
	   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	       
	   setLocation(50, 50); 
	   setSize(200, 90); 
	   setLayout(new GridLayout(3,1));

	   final JTextField zielx=new JTextField();
	   add(zielx);
	   final JTextField ziely=new JTextField();
	   add(ziely);
	   JButton start=new JButton("leg los");
	   start.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent arg0) {
			berechne(Double.parseDouble(zielx.getText()), Double.parseDouble(ziely.getText()));
		}
	   });
	   add(start);
   }
   
   public void berechne(double zielx, double ziely){
	   System.out.println("Ziel ist "+zielx+" , "+ziely);
	   double schrittweite=10;	//Wie weit kann ich pro Schritt gehen
	   double aktx=0, akty=0;	//Aktuelle Position, als Start wird 0 vorausgesetzt
	   while (true){
		   double hypotenuse=Math.sqrt((aktx-zielx)*(aktx-zielx)+(akty-ziely)*(akty-ziely));
		   //Ist die Schrittweite kleiner als der noch zu gehende weg?
		   if(schrittweite<hypotenuse){
			   //Winkel berechnen
			   double tangens=Math.tan((ziely-akty)/(zielx-aktx));
			   //Mit Schrittweite und Winkel neue Positionen berechnen
			   aktx=schrittweite*Math.sin(tangens);
			   akty=schrittweite*Math.cos(tangens);
			   System.out.println(" Schritt "+aktx+" , "+akty);
			   continue;
		   }
		   System.out.println("Ankunft an "+zielx+" , "+ziely);
		   break;
	   }
   }
}
```

Soweit der Plan, und es klappt nicht. Klar, debugger an und los, aber ich komme grad mal bis double tangens, da 
setzt mein Verständniss schon aus. Beispiel: ich starte bei 0 0, und will nach 100 100, dann ist das eindeutig ein 45
Grad Winkel. Wieso ist tangens dann 1.5... ?? Ich nehm an ich hab einfach die Formel falsch umgesetzt?

Danke schonmal


----------



## FArt (17. Jul 2008)

Nur geraten:
http://java.sun.com/docs/books/tutorial/java/data/beyondmath.html
Der zweite Satz unter "Trigonometric Methods" dürft dein Fallstrick sein.


----------



## Hollow (17. Jul 2008)

Der Cosinus?? Ich häng doch schon beim Tangens?

Aber danke, zumindest weiss ich jetzt das Radiens != Grad ist, also ist mein Tangens von 1.55 umgerechnet 88,79
Grad??? Das kann ja auch nicht stimmen. Ich bekomm auch nicht wirklich eine Vorstellung davon was Radiens sein
soll, anscheinend nur ne andere Einheit für Winkel, laut Wiki 180/TT, was bei 90 Grad echt komisch unrunde Zahlen
ergäbe. Ich hätt in Mathe doch aufpassen sollen  :?


----------



## Gast (17. Jul 2008)

vielleicht so?
startX = 0
startY = 0

endX = 100
endY = 100

r = 0 #Strecke zwischen Start und Endpunkt

alpha = atan2(endY - startY ,endX - startX)

while(aktX <= endX){
    aktX = cos(alpha)*r + startX
    aktY = sin(alpha)*r + startY
}


----------



## Gast (17. Jul 2008)

hatt ich vergessen

und natürlich r hochzählen


----------



## Hollow (17. Jul 2008)

Danke genau das wars.


```
public void berechne(double zielx, double ziely){
	   System.out.println("Ziel ist "+zielx+" , "+ziely);
	   double aktx=0, akty=0;	//Aktuelle Position, als Start wird 0 vorausgesetzt
	   double startx=0, starty=0;	//Aktuelle Position, als Start wird 0 vorausgesetzt
	   double alpha = Math.atan2(ziely - akty ,zielx - aktx) ;
	   int r=10;
	   while(aktx <= zielx){ 
		   aktx = Math.cos(alpha)*r + aktx ;
		   akty = Math.sin(alpha)*r + akty ;
		   System.out.println(" Schritt "+aktx+" , "+akty);
	   }
	   System.out.println("Ankunft an "+zielx+" , "+ziely);
   }
```

Wenn ich start und akt als dieselben Variablen nehme spar ich mir dabei sogar das r hochzählen.

Für die die nach mir kommen:
while(aktx <= zielx) klappt nur bei positiven Werten, bei möglicherweise negativen Werten muss diese
Bedingung angepasst werden.


Danke nochmals


----------

