# Anpeilungsformeln



## Developer_X (20. Dez 2009)

Hi, ich habe einmal meinen Physik lehrer darum gebeten, mir die formel zur Anpeilung von was auch immer zu geben.

Er gab mir diese Formel:

```
winkel = (Potenz aus tan und -1) * (Y/X)
```
Das heißt, wenn im normalen Coordinaten system, nicht in dem von java, der rotationspunkt auf 0,0 liegt, sind X und Y die Coordinaten des zu anpeilenden Punktes.

Ich schrieb diesen Code hier

```
package game;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class Game extends JFrame implements MouseMotionListener
{
//	Attributes
	AlphaComposite ap;
	GradientPaint gp;
	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	
	int width = getSize().width;
	int height = getSize().height;
	
	int mouseX = 1;
	int mouseY = 1;
	
//	Constructor
	public Game()
	{
		setSize(d);
		setUndecorated(true);
		setLayout(new BorderLayout());

		JPanel p = new JPanel()
		{
			public void paintComponent(Graphics g)
			{
				drawGame(g);
			}
		};
		p.addMouseMotionListener(this);
		add(p,"Center");
		setVisible(true);
		
		width = getSize().width;
		height = getSize().height;
	}
	
//	Methods
	public void drawGame(Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,width,height);
		
		g.setColor(Color.white);
		
		g.translate(0,height);
		((Graphics2D) g).rotate(+Math.toRadians((Math.tan(-1)*((mouseY)/(mouseX)))));
		g.translate(0,-height);

			g.drawRect(0,height-10,20,100);
			
		g.translate(0,height);
		((Graphics2D) g).rotate(-Math.toRadians((Math.tan(-1)*((mouseY)/(mouseX)))));
		g.translate(0,-height);	}

	public void mouseDragged(MouseEvent arg0) 
	{
	}
	public void mouseMoved(MouseEvent arg0)
	{
		mouseX = arg0.getX();
		mouseY = arg0.getY();
		
		mouseY-=height;
		
		if(mouseX==0)
			mouseX++;
		if(mouseY==0)
			mouseY++;
		
		repaint();
	}
}
```

Aber um ehrlich zu sein, der Kasten rotiert wild umher, anstatt richtig wirklich zu funkionieren, und auf den Cursor zu zeigen, kann mir einer vielleicht helfen?
Danke Developer-X


----------



## Spacerat (20. Dez 2009)

Würd' ich gerne... was genau bedeutet [c]Potenz aus tan und -1[/c]? In deinem Code schickt sich das iwie wie [c]Potenz aus tan(-1)[/c] und das würde nicht passen.


----------



## Developer_X (20. Dez 2009)

so hat ers in mein heft geschriebn mit diesem tan

So wie ich das sehe ist das Tan hoch -1


----------



## Developer_X (20. Dez 2009)

also vollkommen hatte er es so in mein HA Heft geschrieben

und ich habe es so ínterpretiert,
a(ist der gesuchte winkel) = (Potenz aus Tan und -1) * (y/x)

ist das falsch?


----------



## Final_Striker (20. Dez 2009)

nein, das ist 1 durch den tangens von y durch x

a = 1 / tan( y / x )


----------



## Spacerat (20. Dez 2009)

...ach so schreibt man den Kotangens heute...
Naja in Java müsste es dann
	
	
	
	





```
Math.tan(x / (double) y)
```
heissen.
Und wenn ich es dann in deinem Code ausprobiere, wird aus
	
	
	
	





```
((Graphics2D) g).rotate(+Math.toRadians((Math.tan(-1)*((mouseY)/(mouseX)))));
```


```
((Graphics2D) g).rotate(+Math.tan(mouseY / (double) mouseX));
```


----------



## Developer_X (20. Dez 2009)

eure Antworten funktionieren bei mir auch nicht, ich hab mir mal den Artikel von Wikipedia über Trigonometrie durchgelesen, das geht einfacher, als mit tangens, ich habe sinus benutzt, 

```
Math.sin((height-mouseY)/a.getDistance(new Vector2D(mouseX,mouseY)))*107
```
Fragtmich nicht wieso, aber wenn man 107 mal nimmt, dann gehts nämlich, fragt net wieso, ich hab lange geprobt, 
ich habe ne kleine grafik anim geschrieben, pastet alle mal das in euren Code


```
public void drawGame(Graphics g)
     {
     	Vector2D a = new Vector2D(0,height);
    		
          g.setColor(Color.black);
         g.fillRect(0,0,width,height);
              
          g.setColor(Color.white);
              
          g.drawLine(0, height-1, mouseX, height-1);
              g.drawLine(0, height, mouseX, mouseY);
          g.drawLine(mouseX, height, mouseX, mouseY);
           
         g.setFont(new Font("",1,20));
       
        g.drawString("A Winkel="+Math.sin((height-mouseY)/a.getDistance(new Vector2D(mouseX,mouseY)))*107+"°",0,height);
        g.drawString("B Winkel=?°",mouseX,mouseY);
        g.drawString("C Winkel=90°",mouseX,height);
        
        g.drawString("SeitenLänge AC="+mouseX,0,30);
         g.drawString("SeitenLänge AB="+a.getDistance(new Vector2D(mouseX,mouseY)),0,60);
         g.drawString("SeitenLänge CB="+(height-mouseY),0,90);
    }
```


----------



## Developer_X (20. Dez 2009)

die Klasse Vector2D

```
package math;

public class Vector2D 
{
//	Attributes
	double x = 0;
	double y = 0;
	
	public Vector2D(double x, double y)
	{
		this.x = x;
		this.y = y;
	}
	
	public double getDistance(Vector2D vec_01)
	{
		double distance = 0;

		double a = vec_01.getX()-x;
		double b = vec_01.getY()-y;
		
		distance = (int) (Math.pow(a, 2) + Math.pow(b, 2));
		distance = Math.sqrt(distance);

		return distance;
	}
	
	public double getX()
	{
		return x;
	}
	public double getY()
	{
		return y;
	}
}
```


----------



## Spacerat (20. Dez 2009)

Was genau funzt denn da nicht? Das Rechteck soll dem Pfeil folgen richtig? Einfach die besagten Zeilen austauschen und den Winkel auf 90° patchen.


----------



## Developer_X (20. Dez 2009)

meins funktionniert aber um ehrlich zu sein, auch nicht gerade so toll,
eures kann ich aber irgendwie net einbauen, funktioniert dann nicht, dreht sich dann wild rum, also was ich jetzt habe

```
package game;
 
import java.awt.*;
import java.awt.event.*;
 
import javax.swing.*;

import math.Vector2D;
 
@SuppressWarnings("serial")
public class Game extends JFrame implements MouseMotionListener
{
//  Attributes
    AlphaComposite ap;
    GradientPaint gp;
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    
    int width = getSize().width;
    int height = getSize().height;
    
    int mouseX = 1;
    int mouseY = 1;
    
//  Constructor
    public Game()
    {
        setSize(d);
        setUndecorated(true);
        setLayout(new BorderLayout());
 
        JPanel p = new JPanel()
        {
            public void paintComponent(Graphics g)
            {
                drawGame(g);
            }
        };
        p.addMouseMotionListener(this);
        add(p,"Center");
        setVisible(true);
        
        width = getSize().width;
        height = getSize().height;
    }
    
//  Methods
    public void drawGame(Graphics g)
    {
        Vector2D a = new Vector2D(0,height);

        g.setColor(Color.black);
        g.fillRect(0,0,width,height);
        
      // mittel
        g.setColor(Color.yellow);
        g.translate(0,height);
        ((Graphics2D) g).rotate(-Math.toRadians(90+Math.sin((height-mouseY)/a.getDistance(new Vector2D(mouseX,mouseY)))*107));
        g.translate(0,-height);
 
            g.drawRect(0,height-10,20,100);
            
        g.translate(0,height);
        ((Graphics2D) g).rotate(+Math.toRadians(90+Math.sin((height-mouseY)/a.getDistance(new Vector2D(mouseX,mouseY)))*107));
        g.translate(0,-height);
      // schlecht
        g.setColor(Color.red);
        g.translate(0,height);
        ((Graphics2D) g).rotate(+Math.tan(mouseY / (double) mouseX));
        g.translate(0,-height);
 
            g.drawRect(0,height-10,20,100);
            
        g.translate(0,height);
        ((Graphics2D) g).rotate(-Math.tan(mouseY / (double) mouseX));
        g.translate(0,-height);
      // 100% korrekt
        g.setColor(Color.green);
        g.drawLine(0, height, mouseX, mouseY);
    }

    public void mouseDragged(MouseEvent arg0) 
    {
    }
    public void mouseMoved(MouseEvent arg0)
    {
        mouseX = arg0.getX();
        mouseY = arg0.getY();
        
        if(mouseX==0)
            mouseX++;
        if(mouseY==0)
            mouseY++;
        
        repaint();
    }
}
```
Einmal (grün) so wie es perfekter weise sein sollte
einmal (rot) so wie du es hast spacerat
einmal (gelb) so wie ich es hab, 

du siehst, meins ist näher dran, ist aber net 100% richtig, was ist jetzt richtig?


----------



## Tobias (20. Dez 2009)

Ich hab mir das jetzt nicht alles durchgelesen, aber ich würde ein Problem beim Umrechnen der Gradzahlen in Radians vermuten?


----------



## Developer_X (20. Dez 2009)

also, ich weiß net wie ich das alles machen soll, wirklich, ich hab keinen Plan was ihr meint.


----------



## Developer_X (20. Dez 2009)

kann mir bitte jemand das Java Code Fragment das ich einsetzten muss sagen, bitte, ich ´verstehe es einfach nicht


----------



## Developer_X (20. Dez 2009)

also meine Formel, 
a/c um alpha rauszubekommen, ist falsch
man bekommt sinus alpha raus.
Wie kommt man aber von sinus alpha zu alpha?
ich habe bei wikipedia von umkehroperationen cosinus gehört, aber wie geht das in java?
Ich beschäftige mich schon den ganzen tag damit!
Und hab immer noch keine lösung


----------



## Spacerat (20. Dez 2009)

```
Math.asin(winkelinrad);
```
schon ausprobiert?


----------



## Marco13 (20. Dez 2009)

Bei tan^(-1) würde ich eher darauf tippen, dass das für Math.atan stehen soll...


----------



## Spacerat (20. Dez 2009)

Marco13 hat gesagt.:


> Bei tan^(-1) würde ich eher darauf tippen, dass das für Math.atan stehen soll...


Sch.... mensch Klar... so ist es auch... zumindest, wenn diese das gewünschte Ergebnis ist
	
	
	
	





```
//  Methods
    public void drawGame(Graphics g)
    {
        g.setColor(Color.black);
        g.fillRect(0,0,width,height);
        double x = mouseX / (double) width;
        double y = (mouseY - height) / (double) height;
      // PERFECT!!!
        g.setColor(Color.red);
        g.translate(0,height);
        ((Graphics2D) g).rotate(Math.PI - Math.atan(x / y));
        g.translate(0,-height);
        g.drawRect(0,height-10,20,100);
    }
    public void mouseMoved(MouseEvent arg0)
    {
        mouseX = arg0.getX();
        mouseY = arg0.getY();

        repaint();
    }
```


----------



## Developer_X (21. Dez 2009)

Sry, aber das geht auch nicht.


```
g.translate(0,height);
			((Graphics2D) g).rotate(-(Math.PI - Math.atan(mouseX / (height-mouseY))));
        g.translate(0,-height);
        	g.drawRect(0,height-10,20,100);
		g.translate(0,height);
	       ((Graphics2D) g).rotate(+(Math.PI - Math.atan(mouseX / (height-mouseY))));
	    g.translate(0,-height);
```

Wenn ich das einfüge, gehts wenigstens einigermaßen, doch wenn der winkel größer als 45 grad wird, von unten aus gesehen, dann dreht das ding wild rum, erst unter 45 ist das hoch präzise, aber da gibts doch bestimmt ne formel, 

space rat hast du es überhaupt bei dir ausprobiert?
Das geht sowas von nicht bei mir, ganze ehrlich, tut mir leid, aber was soll ich jetzt machen.
Kommt schon, ihr wart doch bestimmt schon alle am gymnasium, ihr könnt das locker, ich hab mich gerad in die Trigonometrie reingelesen, und mein lehrer wills mir nicht erklären, könnt ihr mir nicht wirklich die vollkommene lösung sagen bitte?


----------



## Developer_X (21. Dez 2009)

außerdem will ich das für nen individuellen punkt, so vielleicht?

```
public void drawGame(Graphics g)
	{
		Vector2D killa = new Vector2D(400,400);
		
		g.setColor(Color.black);
		g.fillRect(0,0,width,height);
  
		g.setColor(Color.white);
		
        g.translate(+(int)killa.getX(),+(int)killa.getY());
        	((Graphics2D) g).rotate(-(Math.PI - Math.atan((mouseX+killa.getX()) / (height-mouseY))));
        g.translate(-(int)killa.getX(),-(int)killa.getY());
        	g.drawRect(+(int)killa.getX(),+(int)killa.getY(),20,100);
        g.translate(+(int)killa.getX(),+(int)killa.getY());
    		((Graphics2D) g).rotate(-(Math.PI - Math.atan((mouseX+killa.getX()) / (height-mouseY))));
        g.translate(-(int)killa.getX(),-(int)killa.getY());
   }
```
geht nicht ganz, 
außerdem wird der winkel nie unter dem waagerechten sein, das ist auch falsch, das problem ist einfach nur, dass der PunktY 0 nicht unten liegt, sonder oben, ich gedachte mir mit height-mouseY zu helfen. Kann mir einer von euch weiterhelfen?
DX

(!Die klasse Vector2D habe ich oben schon mal gepostet!)


----------



## Spacerat (21. Dez 2009)

Developer_X hat gesagt.:


> space rat hast du es überhaupt bei dir ausprobiert?
> Das geht sowas von nicht bei mir, ganze ehrlich, tut mir leid, aber was soll ich jetzt machen.
> Kommt schon, ihr wart doch bestimmt schon alle am gymnasium, ihr könnt das locker, ich hab mich gerad in die Trigonometrie reingelesen, und mein lehrer wills mir nicht erklären, könnt ihr mir nicht wirklich die vollkommene lösung sagen bitte?


Ja, ich hab's ausprobiert, nein ich war nicht auf einem Gymnasium, das war die vollkommene Lösung... Hier noch mal insgesammt...
	
	
	
	





```
import java.awt.*;
import java.awt.event.*;
 
import javax.swing.*;
 
@SuppressWarnings("serial")
public class Game extends JFrame implements MouseMotionListener
{
//  Attributes
    AlphaComposite ap;
    GradientPaint gp;
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    
    int width = getSize().width;
    int height = getSize().height;
    
    int mouseX = 1;
    int mouseY = 1;
    
//  Constructor
    public Game()
    {
        setSize(d);
        setPreferredSize(d);
        setUndecorated(true);
        setLayout(new BorderLayout());
 
        JPanel p = new JPanel()
        {
            @Override
			public void paintComponent(Graphics g)
            {
                drawGame(g);
            }
        };
        p.addMouseMotionListener(this);
        add(p,"Center");
        setVisible(true);
        
        width = getSize().width;
        height = getSize().height;
    }
    
//  Methods
    public void drawGame(Graphics g)
    {
        g.setColor(Color.black);
        g.fillRect(0,0,width,height);
        double x = mouseX / (double) width;
        double y = (mouseY - height) / (double) height;
      // PERFECT!!!
        g.setColor(Color.red);
        g.translate(0,height);
        ((Graphics2D) g).rotate(Math.PI - Math.atan(x / y));
        g.translate(0,-height);
        g.drawRect(0,height-10,20,100);
    }
    public void mouseMoved(MouseEvent arg0)
    {
        mouseX = arg0.getX();
        mouseY = arg0.getY();

        repaint();
    }
    
    public void mouseDragged(MouseEvent arg0) 
    {
    	// empty
    }

    public static void main(String ... args)
    {
    	final JFrame f = new Game();
    	f.setDefaultCloseOperation(EXIT_ON_CLOSE);
    	f.pack();
    	f.setVisible(true);
    }
}
```
BTW.: warum ich hier da und dort integer in double wandele verstehst du schon, oder?


----------



## Developer_X (21. Dez 2009)

ja das verstehe ich
und das funktioniert jetzt auch, danke, ich werde jetzt versuchen das für individuelle punkte zu machen.


----------



## Developer_X (21. Dez 2009)

so, ich habs versucht:

```
public void drawGame(Graphics g)
    {
        g.setColor(Color.black);
        g.fillRect(0,0,width,height);
        
        Vector2D killa = new Vector2D(width/2,height/2);
        
        double x = (mouseX-killa.getX())/ (double) width;
        double y = ((mouseY-height)-killa.getY()) / (double) height;
        
        g.setColor(Color.white);
        
        g.translate(+(int)killa.getX(),+(int)(height-killa.getY()));
        	((Graphics2D) g).rotate(+(Math.PI - Math.atan(x / y))*2);
        g.translate(-(int)killa.getX(),-(int)(height-killa.getY()));
        	g.drawRect((int)killa.getX()-10,(int)killa.getY()-50,20,100);
        g.translate(+(int)killa.getX(),+(int)(height-killa.getY()));
        	((Graphics2D) g).rotate(-(Math.PI - Math.atan(x / y))*2);
        g.translate(-(int)killa.getX(),-(int)(height-killa.getY()));
        
        g.drawOval((int)x, (int)y, 20, 20);
    }
```

Problem: wenn der cursor unterhalb des punktes ist, dann geht gar nichts mehr,
nur oberhalb, was muss ich hier ändern?


----------



## Developer_X (21. Dez 2009)

ich hab das ganze noch mal überdacht, das mit dem X geht in ordnung, aber wie soll ich das mit Y regeln, das heißt, alles soll perfect funktionieren, nur dass killa.getY() die Y Coordinate des Rotationspunktes und des Objektes ist, wie geht das?

```
public void drawGame(Graphics g)
    {
    	Vector2D killa = new Vector2D(width/2,height/2);
    	
        g.setColor(Color.black);
        g.fillRect(0,0,width,height);
        double x = (mouseX-killa.getX()) / (double) width;
        double y = (mouseY - height) / (double) height;
        // PERFECT!!!
        g.setColor(Color.red);
        g.translate((int)killa.getX(),height);
        	((Graphics2D) g).rotate(+(Math.PI - Math.atan(x / y)));
        g.translate(-(int)killa.getX(),-height);
        	g.drawRect((int)killa.getX(),height-10,20,100);
        g.translate((int)killa.getX(),height);
        	((Graphics2D) g).rotate(-(Math.PI - Math.atan(x / y)));
        g.translate(-(int)killa.getX(),-height);
    }
```
DAs habe ich bis jetzt, und weiter?


----------



## Spacerat (21. Dez 2009)

Versuchs mal so:
	
	
	
	





```
public void drawGame(Graphics g)
    {
        Vector2D killa = new Vector2D(width/2,height/2);
        g.setColor(Color.black);
        g.fillRect(0,0,width,height);
        double x = (mouseX - killa.getX()) / (double) width;
        double y = (mouseY - killa.getY()) / (double) height;
        g.setColor(Color.red);
        g.translate(killa.getX(),killa.getY());
        ((Graphics2D) g).rotate(Math.PI * ((y < 0)? 1 : 2) - Math.atan(x / y));
        g.drawRect(-10,0,20,100);
    }
```


----------



## Developer_X (21. Dez 2009)

danke man!


----------

