Anpeilungsformeln

Developer_X

Top Contributor
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:
Code:
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
Java:
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
 
S

Spacerat

Gast
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

Top Contributor
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?
 
S

Spacerat

Gast
...ach so schreibt man den Kotangens heute...
Naja in Java müsste es dann
Java:
Math.tan(x / (double) y)
heissen.
Und wenn ich es dann in deinem Code ausprobiere, wird aus
Java:
        ((Graphics2D) g).rotate(+Math.toRadians((Math.tan(-1)*((mouseY)/(mouseX)))));
Java:
        ((Graphics2D) g).rotate(+Math.tan(mouseY / (double) mouseX));
 
Zuletzt bearbeitet von einem Moderator:

Developer_X

Top Contributor
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,
Code:
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

Java:
    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

Top Contributor
die Klasse Vector2D
Java:
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;
	}
}
 
S

Spacerat

Gast
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

Top Contributor
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
Java:
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

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

Developer_X

Top Contributor
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
 
S

Spacerat

Gast
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
Java:
//  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

Top Contributor
Sry, aber das geht auch nicht.

Java:
		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

Top Contributor
außerdem will ich das für nen individuellen punkt, so vielleicht?
Java:
	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!)
 
Zuletzt bearbeitet:
S

Spacerat

Gast
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...
Java:
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

Top Contributor
so, ich habs versucht:
Java:
    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

Top Contributor
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?
Java:
    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?
 
S

Spacerat

Gast
Versuchs mal so:
Java:
    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);
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Developer_X AnpeilungsFormeln in der Praxis Spiele- und Multimedia-Programmierung 12

Ähnliche Java Themen

Neue Themen


Oben