# richtungswinkel ausrechnen



## coolerouny (8. April 2005)

morgen!

kann mir vielleicht einer helfen wie ich einen winkel zwischen zwei punkten ausrechnen kann

ich schaff es zwar eigentlich, aber irgendwie geht das unter 45° nicht und es hängt sich nach einer zeit auf  

und ich möchte das ganze dann so programmiern, dass es bei jedem pc gleich schnell geht, also dass es bei einem schnelleren pc nicht schneller ist.

den code könnt ihr euch ja anschaun...


```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class rundown extends Applet
implements MouseMotionListener,MouseListener,KeyListener
{
	int xSize = 640; //größe
	int ySize = 480;
	
	int mouseX = 0; //maus position
	int mouseY = 0;
	
	int xpos = 100; //startposition
	int ypos = 100;
	
	int xunt=0,yunt=0;
	
	int durch = 20;
	
	int speed = 5; //speed halt
	
	int linksrechts = 0; // -1 = links, 1 = rechts
	int obenunten = 0; // -1 = oben, 1 = unten
	
	int shoot = 0;
	
	double pi = 3.141592654; //pi halt
	
	//büdl
	int iconHeight = 32;
  	int iconWidth  = 32;
  	int iconCount  = 36; //eins mehr zur sicherheit
  	Image icon[] = new Image[iconCount];
  	Image allIcons;
  	
  	
	public void init()
	{
		loadImages("mandal.gif");
		
		addMouseMotionListener(this);
		addMouseListener(this);
		addKeyListener(this);
		
		setSize(xSize,ySize);
	}
	
	Image buffer;
    Graphics2D gBuffer;
    
    public void paint(Graphics g)
	{
		xpos = BewegungX();
		ypos = BewegungY();
		
		// Double-Buffering
        if (buffer==null) 
        {
            buffer = createImage(this.getSize().width, this.getSize().height);
            gBuffer = (Graphics2D)buffer.getGraphics();
        }
        
        gBuffer.clearRect(0,0,xSize,ySize);

        // Antialiasing
        gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        //zeichnen
        gBuffer.drawImage(icon[Direction()/36], xpos-32/2, ypos-32/2, this);
        gBuffer.drawString("dir = " + Direction(),300,300);
        
        //rahmen
        gBuffer.drawRect(0,0,xSize-1,ySize-1);
       	
        if (shoot == 1)
        	gBuffer.drawLine(xpos,ypos,mouseX,mouseY);
        	
        g.drawImage (buffer, 0, 0, this);
              
        repaint();
    }
    private int BewegungX()
    {
    	//bewegung in x-Richtung
		if (linksrechts == 1)
			xpos += speed;
		else if (linksrechts == -1)
			xpos -= speed;
			
		return xpos;
    }
    
    private int BewegungY()
    {
    	//bewegung in y-Richtung
    	if (obenunten == 1)
			ypos += speed;
		else if (obenunten == -1)
			ypos -= speed;
		
		return ypos;
    }
    
    private int Direction()
    {
    	xunt = xpos-mouseX;
    	yunt = ypos-mouseY;
    	
    	int dir = (int)(Math.atan(yunt/xunt)*180/pi); //winkel in deg ausrechnen
    	
    	return dir;
    }
    
    public void loadImages(String s) 
	{
    	MediaTracker t=new MediaTracker(this);
    	allIcons=createImage(1,1);
    	try 
    	{
      		URL u=new URL(getCodeBase(), s);
      		allIcons=Toolkit.getDefaultToolkit().getImage(u);
     		t.addImage(allIcons,0);
      	} 
    	catch (MalformedURLException me) 
    	{
      		System.out.println("MalformedURLException: " + me);
      	}
    	try 
    	{
      		t.waitForAll(15000);
      	} 
    	catch (InterruptedException e) 
    	{
      		System.out.println("interrupted");
      	}
    	for (int i=0; i < iconCount; i++) 
    	{
      		Image z=createImage(iconWidth,iconHeight);
      		Graphics g=z.getGraphics();
      		g.clipRect(0,0,iconWidth,iconHeight);
      		g.drawImage(allIcons,-i*iconWidth,0,this);
      		icon[i]=z;
      	}
  	}
    
    public void mouseMoved(MouseEvent event)
	{
		mouseX = event.getX();
		mouseY = event.getY();
	}
	
	public void mouseExited (MouseEvent event){;}
	
	public void mouseEntered(MouseEvent event){;}
	
	public void mouseReleased(MouseEvent event)
	{
		shoot = 0;
	}
	public void mousePressed(MouseEvent event)
	{
		shoot = 1;
		
		mouseX = event.getX();
		mouseY = event.getY();
	}
	
	public void mouseClicked(MouseEvent event){;}
	
	public void mouseDragged(MouseEvent event)
	{
		mouseX = event.getX();
		mouseY = event.getY();
	}
	
	public void keyTyped(KeyEvent evt) 
	{
		char ch = evt.getKeyChar();
		
		if (ch == 'a') 
			linksrechts = -1;
		else if (ch == 'd')
			linksrechts = 1;
		if (ch == 'w')
			obenunten = -1;
		else if(ch == 's')
			obenunten = 1;
	}
		
	public void keyPressed(KeyEvent evt){;}
		
	public void keyReleased(KeyEvent evt) 
	{
		char ch = evt.getKeyChar();
		
		if (ch == 'a' || ch == 'd')
			linksrechts = 0;
		if (ch == 'w' || ch == 's')
			obenunten = 0;
	}
	
		
	public void update(Graphics g){paint(g);}
}
```


----------



## Thomas Darimont (8. April 2005)

Hallo!

Braucht man nicht mindestens 3 Punkte um den Winkel zu bekommen?

Gruß Tom


----------



## coolerouny (8. April 2005)

na eigentlich nicht...

in echt gehts ja auch mit zwei oda?

weißt du auch nicht wie es sonst gehn könnte?

aber weißt du vl wie ich es bei jedem pc gleich schnell gehen könnte?


----------



## Thomas Darimont (8. April 2005)

Hallo!

Also ich denke man braucht 3 Punkte.

Zwei Punkte ergeben eine Strecke und damit folglich auch keinen Winkel.
Mit drei Punkten hauts schon eher hin ;-)
...mit etwas Methematik geht alles ;-)
http://obelix.gymliestal.ch/~erdin.manuel/trigo3.pdf

Siehe Beispiel:

```
/**
 * 
 */
package de.tutorials;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

/**
 * @author Tom
 */
public class AngleTest extends JFrame {

	private Point pA, pB, pC;

	private Stroke stroke = new BasicStroke(5.0F);

	private BufferStrategy strategy;

	private GradientPaint gradienPaint = new GradientPaint(50.0F, 45.0F,
			Color.YELLOW, 1.0F, 100.0F, Color.RED);

	private Font font = new Font("Arial", Font.BOLD, 12);

	private Thread runner = new Thread() {
		public void run() {
			while (true) {

				Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
				g.clearRect(0, 0, 320, 240);

				g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
						RenderingHints.VALUE_ANTIALIAS_ON);

				g.drawLine(pA.x, pA.y, pB.x, pB.y);
				// g.drawLine(pB.x, pB.y, pC.x, pC.y);
				g.drawLine(pC.x, pC.y, pA.x, pA.y);

				double c = pB.x - pA.x;

				double h = pA.y - pC.y;

				double vB = pC.x - pA.x;
				double b = Math.sqrt(Math.pow(vB, 2.0D) + Math.pow(h, 2.0D));

				double vA = pB.x - pC.x;
				double a = Math.sqrt(Math.pow(vA, 2.0D) + Math.pow(h, 2.0D));

				double alpha = Math
						.acos((Math.pow(a, 2.0D) - Math.pow(b, 2.0D) - Math
								.pow(c, 2.0D))
								/ (-2.0D * b * c));

				int degrees = (int) Math.toDegrees(alpha);

				if (pC.y >= pA.y) {
					degrees = 360 - degrees;
				}

				// System.out.println(degrees);

				Paint oldPoint = g.getPaint();
				g.setPaint(gradienPaint);
				g.fillArc(pA.x - 40, pA.y - 40, 80, 80, 0, degrees);
				g.setPaint(oldPoint);

				g.setStroke(stroke);

				g.setColor(Color.RED);
				g.fillOval(pA.x - 2, pA.y - 2, 4, 4);

				g.fillOval(pB.x - 2, pB.y - 2, 4, 4);

				g.fillOval(pC.x - 2, pC.y - 2, 4, 4);

				g.setColor(Color.BLACK);
				g.setFont(font);
				g.drawString(String.valueOf(degrees), pA.x - 5, pA.y - 10);

				g.dispose();

				strategy.show();
				try {
					sleep(50L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	};

	public AngleTest() {
		super("AngleTest");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(320, 240);

		pA = new Point(120, 160);
		pB = new Point(240, 160);
		pC = new Point(130, 90);

		addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseMoved(MouseEvent evt) {
				pC = evt.getPoint();
			}
		});

		setBackground(Color.WHITE);
		setVisible(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
		runner.start();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new AngleTest();
	}
}
```

Gruß Tom


----------



## coolerouny (8. April 2005)

super; danke!

aber was is Math.pow ? :">

und weißt du auch warum es sich bei mir immer nach einer zeit aufhängt?

mfg
coolerouny


----------



## Thomas Darimont (9. April 2005)

Hallo!

Math.pow(a,b): berechnet a hoch b

Weshalb es sich dein Programm bei dir dauernd aufhängt weis ich nicht.

Gruß Tom


----------



## coolerouny (9. April 2005)

super danke!

könnte es sein, dass man in "paint" keine solche rechnungen durchführen darf?

und mir is noch was eingefallen:
wie kann ich andere klassen (außer paint) immer wiederholen lassen?

mfg
coolerouny


----------



## Thomas Darimont (9. April 2005)

Hallo!



> wie kann ich andere klassen (außer paint) immer wiederholen lassen?



Du meinst Methoden... Zur "Wiederholung"kannst du beispielsweise verschiedene Schleifen konstrukte Verwenden. Diese könntest du auch ein einem eigenen Thread (siehe mein Beispiel -> runner) ablaufen lassen.

Gruß Tom


----------



## coolerouny (10. April 2005)

morgen!

k; danke


----------



## coolerouny (10. April 2005)

du checkst as aber irgendwie schon ab...

ich hab noch a paar fragen:
was bringt sich des stroke?
was dispose()?
was Math.sqrt?
und was Math.toDegrees?

ps:
nochmals danke, hast mir sehr geholfen


----------



## Thomas Darimont (10. April 2005)

Hallo!

>was bringt sich des stroke?
Damit mache ich die Linie dicker...
>was dispose()?
Damit gebe ich den Graphics Context wieder frei
>was Math.sqrt?
Quardatwurzel
>und was Math.toDegrees?
Damit wandle ich die Winkelgröße von Rad(Radians) nach Grad (Degrees) um.

Gruß Tom


----------



## coolerouny (11. April 2005)

k danke!

ich hab von rad in grad immer mit irgendwas*180/pi

umgerechnet =)


----------



## coolerouny (11. April 2005)

wie kann ich eigentlich dein example auf einen pc ohne jcreator oder so was starten(also zum beispiel mit ner .bat datei; aber das geht irgendwie nicht) ?


----------



## mike12345 (13. April 2005)

nein für den richtungswinkel braucht man tatsächlich nur 2 punkte
also 2 punkte A und B haben auch 2 verschieden richtungswinkel ( RW(A,B) und RW(B,A) ) wobei sich beide nur um 180grad bzw 200 gon unterscheiden.
es ist einfach der winkel von der ordinate (start im 1.ten quadranten) durch den ersten punkt verschoben auf die linie der 2 punkte richtung dem 2ten punkt im uhrzeigersinn. 
meist aber in gon.
und meist im uhrzeigersinn.


----------



## coolerouny (13. April 2005)

ja danke aber mit dem obigen beispiel geht's auch, wenn man einfach immer einen punkt in 200,0 entfernung vom objekt annimmt  ^^


----------



## nemoy (29. April 2005)

unter folgender URL ist ein JavaCode zu finden, der anhand zweier Punkte den Richtungswinkel bestimmt.

http://www.ibm.franken.de/geocaching/main_geo6.html

n


----------

