# Punkt-Winkel Berechnung



## Developer_X (22. Apr 2010)

Hi.

Ich habe einen Punkt A, dessen Coordinaten sind X und Y.
Ich habe auch einen Winkel Alpha.
Ich habe auch einen Radius r.

Nun möchte ich von Punkt A aus auf Punkt B rechnen, wie in anbeigeheftetem Bild.

Wie geht das?


----------



## Landei (22. Apr 2010)

Die "Höhe" von B ist die Gegenkathete zu alpha im rechtwinkligen Dreieck (das entsteht, wenn man von B senkrecht nach unten zeichnet). Hypothenuse ist natürlich r. 

sin(alpha) = Gegenkathete / Hypothenuse
Gegenkathete = Hypothenuse * sin(alpha)
Also: B.y = A.y + r*sin(alpha)

Analog gilt für den "horizontalen Abstand" (die Ankathete):
cos(alpha) = Ankathete / Hypothenuse
Ankathete = Hypothenuse * cos(alpha)
Also: B.x = A.x - r*cos(alpha) [zumindest wenn B wie in der Zeichnung links von A sein soll]

Findest du alles hier

Nicht vergessen, dass Winkel in für Javas Winkelfunktionen in Radiant angegeben werden (und nicht in Grad).


----------



## Developer_X (23. Apr 2010)

Hey danke, das hätte ich mit meinen trigonometrischen kenntnissen nicht hinbekommen.
Danke für den Link, ich werd da erst noch mal alles lesen müssen bevor ich weiter programmiere.

Developer_X


----------



## Developer_X (23. Apr 2010)

Also ich will sowas wie Astroids, wers kennt, programmieren.

Ich hatte mir überlegt, erstmal, dass ich wie in der Physik 2 Variablen habe, f_UP (Kraft die den Körper (das Schiff) nach oben drückt, bzw. bei negativem Wert nach unten) und f_LEFT (Kraft die den Körper (das Schiff) nach links drückt, bzw. bei negativem Wert nach rechts).

Das mit up und down klappt schon super.
Bei left bzw. right habe ich die funktion eingebaut, dass das schiff sich dreht.
Aber die vorwärts beschleunigung soll sich auf den Körper auch auf seine rotation beziehen.

Wie könnte ich das anstellen?
Ich habe mir überlegt, in einem Thread, jedes mal von der X und Y Koordinate f_UP und f_LEFt zu addieren.

f_UP und f_LEFT werden also mit Berechnungen geändert.

Nun dachte ich mir, >>wie könnte ich das anstellen?<<.


```
public void run() 
	{
		int counter = 0;
		
		while(true)
		{
			repaint();
			
			keyInteraction();
			maneuver();
			
			if(counter==5)
			{
				shotInteraction();
				counter = 0;
			}
			else
				counter++;
			
			try{Thread.sleep(10);}catch(Exception e){}
		}
	}
	
	public void maneuver()
	{
		double x = (mouseX - shipX) / (double) d.width;
        double y = (mouseY - shipY) / (double) d.height;
        shipRot = Math.toRadians((Math.PI * ((y < 0)? 1 : 2) - Math.atan(x / y))); 
        
		shipX += f_LEFT;
		shipY += f_UP;
		
		if(shipY<0)
			shipY = d.height;
		else if(shipY>d.height)
			shipY = 0;
		
		if(shipX<0)
			shipX = d.width;
		else if(shipX>d.width)
			shipX = 0;
	}
	
	public void keyInteraction()
	{
		if(left)
			f_LEFT -=0.05;
		if(right)
			f_LEFT +=0.05;
	
		if(up)
			f_UP -= 0.05;
		if(down)
			f_UP += 0.05;
	}
	// left, right, up und down sind booleans, sie werden aktiviert bei
	// Tasten betätigung, und werden deaktiviert, bei Tasten enttätigung.
	// f_LEFT und f_UP sind double.
```

Ich hatte mit der Lösung hier in diesem Thread gedacht, ich hätte die Lösung für mein Problem.
Einfach die x und y koordinaten vom neuen Punkt vom Alten Punkt subtrahieren, und diese dann zu f_UP bzw. f_LEFT zu addieren. Aber das hatte nicht wirklich funktioniert. Hat einer von euch eine Idee, wie man dieses Problem angehen könnte?


----------

