richtungswinkel ausrechnen

  • Themenstarter Themenstarter coolerouny
  • Beginndatum Beginndatum
C

coolerouny

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...

Code:
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);}
}
 

Anhänge

Zuletzt bearbeitet von einem Moderator:
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?
 
Zuletzt bearbeitet von einem Moderator:
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:
Code:
/**
 * 
 */
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
 

Anhänge

  • angle2.gif
    angle2.gif
    5,5 KB · Aufrufe: 92
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
 
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
 
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
 
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
 
Zurück