Winkel zwischen 2 Punkten und der X-Achse

Mikescher

Mitglied
Guten Mittag,

ich bin gerade an einem ziemlich verzwickten Problem:
ich möchte den Winkel zwischen 2 Punkten und der X-Achse angeben. Der Winkel soll mit dem Uhrzeigersinn verlaufen.
Hier sind 3 Beispiele was für Winkel die Funktion eigentlich liefern sollte :
bspy.jpg


gelöst habe ich (bisher das so):
Java:
    /**
     * berechnet den Winkel zweier Punkte relativ zur X-Achse im Gradmaß
     *
     * @param otherP Den 2. Punkt der Winkelberechnung
     * @return Der Winkel der 2 Punkte
     */
    public int getAngle(TPos otherP)
    {       
        int dx = otherP.getX() - this.getX();
        int dy = otherP.getY() - this.getY();
        int adx = Math.abs(dx);
        int ady = Math.abs(dy);
        
        if (dy == 0 && dx == 0)
        {
            return 0;
        }
        else if (dy == 0 && dx > 0)
        {
            return 0;      
        }
        else if (dy == 0 && dx < 0)
        {
            return 180;
        }
        else if (dy > 0 && dx == 0)
        {
            return 270;
        }
        else if (dy < 0 && dx == 0)
        {
            return 90;
        }
        
        double rwinkel = Math.atan(ady /adx);  
        double dWinkel = 0;
            
        if (dx>0 && dy>0)  // 1. Quartal Winkkel von 270° - 359°
        {
            dWinkel = 360 - Math.toDegrees(rwinkel);
        }
        else if (dx<0 && dy>0)  // 2. Quartal Winkkel von 180° - 269°
        {
            dWinkel = 180 + Math.toDegrees(rwinkel);
        }
        else if (dx>0 && dy<0)  // 3. Quartal Winkkel von 90° - 179°
        {
            dWinkel = 180 - Math.toDegrees(rwinkel);
        }
        else if (dx<0 && dy<0)  // 4. Quartal Winkkel von 0° - 89°
        {
            dWinkel = Math.toDegrees(rwinkel);
        }
        
        int iWinkel = (int)dWinkel;
        
        if (iWinkel == 360) 
        {
            iWinkel = 0;
        }
       
//         System.out.println("["+getX()+"|"+getY()+"]-["+otherP.getX()+"|"+otherP.getY()+"] "+dWinkel+"°");
        
        return iWinkel;
       
    }

Ein paar Hinweise noch:
über this.getX() und this.getY() bekommt man X und Y von P1.
genauso ist in otherP P2 drin.
Ich programmiere alles in Greenfoot (eine vereinfachte Entwicklungsumgebung für java) - das sollte hier aber kein Unterschied machen.

Jetzt zum Problem:

Die Funktion liefert mir für jeden Fall (außer 0,90,180,270) eindeutig falsche Werte. Sie liefert mir sogar meist einfach nur 180,0 oder 90,0 aus obwohl sich otherP immer verändert.

Ich bin jetzt schon 2 Tage an dieser Funktion - nach meinem besten Wissen müsste sie eigentlich funktionieren. Deshalb hoffe ich jetzt dass jemand der klüger ist als ich :D vielleicht sehen kann wo das Problem liegt.

Mit freundlichen Grüßen an jeden der sich das bis hier durchgelesen hat :)
Mike
 

Illuvatar

Top Contributor
Ich vermute, dass das das Problem ist:
Java:
double rwinkel = Math.atan(ady /adx);
Hier dividierst du 2 Integer, dann kommt auch wieder ein int dabei raus und wird abgerundet. Das heißt zum Beispiel, für
Code:
adx > ady
ist das Ergebnis der Division auf jeden Fall 0.
Probier mal
Java:
double rwinkel = Math.atan((double) ady / adx);
 

Mikescher

Mitglied
:toll: Danke Illuvatar :toll: ,
Das war's - wusste ich gar nicht das java das so eng nimmt (bin ja ein Umsteiger ;) ).
Jetzt funktioniert's - die Drehung ist zwar noch um ab und zu 90°/180°/270° verschoben aber das bekomme ich selber hin.
Also dickes DANKE an dich :)
 

muckelzwerg

Bekanntes Mitglied
Ich weiß nicht, ob ich Deine Sonderfälle alle richtig verstehe. Kannst Du nicht einfach die Standardformel aus der Vektorrechnung verwenden und anschließend auswählen, ob Du 180 - Winkel oder 360 - Winkel etc. verwendest, je nach Sonderfall?

Edit: Hat sich dann wohl erledigt. ;)
 
T

Thomas Schütt

Gast
Diese Winkelberechnung hat es ja in sich - nach mehreren Fehlversuchen habe ich gegooglet und bin hier gelandet. Danke für den Code!

Zum Testen hab ich eine kleine Main-Klasse geschrieben, die vielleicht dem einen oder anderen helfen mag:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class PaintTest extends JFrame {
	int sizeX = 600;
	int sizeY = 600;
	
	public static void main(String[] args) {
		new PaintTest();
	}
	
	public PaintTest() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(sizeX, sizeY);
		setLocation(600,400);
		add(new DrawPanel());
		setVisible(true);
	}
	

	class DrawPanel extends JPanel {
		private static final long serialVersionUID = 1L;
		private int mouseX = 0;
		private int mouseY = 0;
		
		public DrawPanel() {
			setBackground(Color.WHITE);
			addMouseMotionListener(new MouseMotionListener() {
				public void mouseMoved(MouseEvent e) {
					mouseX = e.getX()-4;
					mouseY = e.getY()-14;
					repaint();
				}
				
				public void mouseDragged(MouseEvent e) {
				}
			});
	    }
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.fillOval(sizeX/2, sizeY/2, 8, 8); // mittelpunkt
	        
			// das testobjekt
			int angle = GeoUtils.getPointToPointAngle(sizeX/2, sizeY/2, mouseX , mouseY);
	        
			g.fillOval(mouseX, mouseY, 8, 8);
			g.drawString(""+angle, mouseX+12, mouseY);
		}
	}
}

Grüße,
Thomas
(der münchner, nicht der hambuger ;-)
 

Crian

Top Contributor
Da ich keine Lust hatte, dafür eine Bibliothek zu installieren, war ich mal so frei, das etwas umzuschreiben. Dabei liegt bei mir - wie in der Mathematik - der Nullpunkt rechts auf der X-Achse. Aber seht selbst.

Java:
package graphicalUserInterface;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;


@SuppressWarnings("serial")
public class PaintTest extends JFrame {
    int sizeX = 600;
    int sizeY = 600;

    public static void main(String[] args) {
        new PaintTest();
    }

    public PaintTest() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(sizeX, sizeY);
        setLocation(600,400);
        add(new DrawPanel());
        setVisible(true);
    }


    class DrawPanel extends JPanel {
        private static final long serialVersionUID = 1L;
        private int mouseX = 0;
        private int mouseY = 0;

        public DrawPanel() {
            setBackground(Color.WHITE);
            addMouseMotionListener(new MouseMotionListener() {
                public void mouseMoved(MouseEvent e) {
                    mouseX = e.getX()-4;
                    mouseY = e.getY()-14;
                    repaint();
                }

                public void mouseDragged(MouseEvent e) {
                }
            });
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            /* Mauskoordinaten */
            int mouX = mouseX;
            int mouY = mouseY;

            /* Mittelpunkt-Koordinaten */
            int midX = sizeX/2;
            int midY = sizeY/2;

            /* Mittelpunkt zeichnen */
            g.fillOval(midX-5, midY-5, 10, 10);

            /* Punkt an Cursor zeichnen: */
            g.fillOval(mouX-5, mouY-5, 10, 10);

            /* Verbindungslinie zeichnen: */
            g.drawLine(midX, midX, mouX, mouY);

            /* Winkel berechnen: */
            long angle = calculateAngle(midX, midY, mouX, mouY);

            /* Winkel als Text darstellen: */
            g.drawString(Long.toString(angle), mouX+12, mouY);
        }

        /**
         * Winkelberechnung
         *
         *             (bx,by)
         *                *
         *               /|
         *              / |
         *          dz /  | dy
         *            /   |
         *           /g   |
         *  (ax,ay) *-----*
         *             dx
         *
         * @param ax x-Koordinate des Mittelpunktes
         * @param ay y-Koordinate des Mittelpunktes
         * @param bx x-Koordinate des Zielpunktes
         * @param by y-Koordinate des Zielpunktes
         *
         * @return Winkel
         */
        private long calculateAngle(int ax, int ay, int bx, int by) {
            if (ax == bx && ay == by)
                return 0;

            /* Berechnung der Seitenlängen des Dreiecks: */
            double dx = bx - ax;
            double dy = ay - by;
            double dz = Math.sqrt(dx*dx + dy*dy);

            /*
             * Berechnung des Winkels nach Pythagoras:
             *      sin(gamma) = dy/dz
             * <=>  gamma      = arcsin(dy/dz)
             */
            double gamma = Math.asin(dy / dz);

            /* Umrechnung von RAD auf DEG: */
            gamma = 180 * gamma / Math.PI;

            long angle = Math.round(gamma);

            /* erster Quadrant: */
            if (bx >= ax && by <= ay)
                ; /* passt schon so */
            /* zweiter Quadrant: */
            else if (bx <= ax && by <= ay)
                angle = 180 - angle;
            /* dritter Quadrant: */
            else if (bx <= ax && by >= ay)
                angle = 180 - angle;
            else if (bx >= ax && by >= ay)
                angle = 360 + angle;

            return angle;
        }
    }

}
 

Crian

Top Contributor
Die Quadranten sind in der Mathematik normalerweise so eingeteilt: 1. oben rechts, 2. oben links, 3. unten links, 4. unten rechts. Wobei man rechts auf der x-Achse mit 0° anfängt, oben auf der y-Achse 90° erreicht, links auf der x-Achse 180° und so weiter, bis man von unten ankommend auf der x-Achse rechts dann 360° erreicht hat.


Edit: Ein Bild sagt mehr als viele Worte: Quadrant ? Wikipedia
 

muckelzwerg

Bekanntes Mitglied
Ähm, eigentlich willst Du doch nur sagen, dass Du die Drehung gegen den Uhrzeigersinn berechnest, so wie es am Einheitskreis üblich ist? "NullPUNKT rechts" hat mich verwirrt. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
K Umrechnung Koordinaten zu Winkel Java Basics - Anfänger-Themen 3
CptK Methoden Berechnung von Anfangsgeschwindigkeit und Winkel Java Basics - Anfänger-Themen 27
R Winkel berechnen bzw. Geraden sortieren Java Basics - Anfänger-Themen 33
J Kollision eines Kreises mit einem 270° Winkel im 2D-Raum Java Basics - Anfänger-Themen 29
S Probleme mit Winkel und EInheitskreis Java Basics - Anfänger-Themen 3
T mit Winkel & Sinus rechnen / sin(30°)=2,5 Java Basics - Anfänger-Themen 7
N Winkel berechnen lassen Java Basics - Anfänger-Themen 7
S Mathe in der Programmierung (Winkel im Bogenmaß) Java Basics - Anfänger-Themen 7
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
S Unterschied zwischen Denkweisen Java Basics - Anfänger-Themen 13
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
Ras Unterschied zwischen parser xml and api xml Java Basics - Anfänger-Themen 7
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
U Erste Schritte nextGaussian zwischen zwei Werten Java Basics - Anfänger-Themen 19
jhCDtGVjcZGcfzug Was ist der Unterschied zwischen diesen Quellcodes? Java Basics - Anfänger-Themen 3
rafi072001 Assoziation zwischen Musiker und Label Java Basics - Anfänger-Themen 1
I Best Practice Saubere Verbindung zwischen API und Business Layer mit DTO's Java Basics - Anfänger-Themen 2
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
W User zwischen Optionen wählen lassen Java Basics - Anfänger-Themen 1
I Differenz zwischen LocalDateTime Java Basics - Anfänger-Themen 4
Leo_1789 Differenz ausrechnen zwischen denn idealgewicht und denn echten Gewicht Java Basics - Anfänger-Themen 7
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
NeoLexx Zuweisungskompatibilität zwischen Vererbungsbeziehungen (Polymorphie) Java Basics - Anfänger-Themen 18
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
N Berührung zwischen Rechtecken Java Basics - Anfänger-Themen 5
Y Unterschied zwischen WindowBuilder und herkömmlichen erstellen des GUI´s? Java Basics - Anfänger-Themen 9
J Wert zwischen JFrames übergeben Java Basics - Anfänger-Themen 2
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
E Unterschied zwischen new und import Java Basics - Anfänger-Themen 5
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
Dilara_K Abstand zwischen den Doppelwerten in einem Array herausfinden Java Basics - Anfänger-Themen 20
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
D Zufallszahl zwischen 10 und 99? Java Basics - Anfänger-Themen 5
J Objektzugriff zwischen disjunkten Klassen Java Basics - Anfänger-Themen 1
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
X Input/Output Höchste Temperaturschwankung zwischen 2 Tagen Java Basics - Anfänger-Themen 2
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
Aprendiendo Unterschied zwischen Referenzvariable und Instanzvariable. Java Basics - Anfänger-Themen 2
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
K Klassen Array zwischen Klassen übergeben Java Basics - Anfänger-Themen 2
Arif OOP Die Bindung zwischen einem äußeren und einem inneren Objekt Java Basics - Anfänger-Themen 2
schoenosrockos Unterschied zwischen Objekten und vererbungen Java Basics - Anfänger-Themen 1
S OOP Variablen zwischen mehreren Klassen Java Basics - Anfänger-Themen 11
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
F Klassen Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 4
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ungerade Zahlen ausgeben lassen zwischen Spannweite zweier eingegeben zahlen Java Basics - Anfänger-Themen 6
V Zufallswert zwischen zwei Zahlen a und b Java Basics - Anfänger-Themen 12
H Datentypen Tage zwischen zwei Datums berechnen Java Basics - Anfänger-Themen 4
M Variable zwischen Klassen übergeben Java Basics - Anfänger-Themen 5
A attach source: Zusammenhang zwischen JAR und .class/.java Dateien? Java Basics - Anfänger-Themen 2
L Unterschied zwischen Klassen - und Instanzvarbiablen Java Basics - Anfänger-Themen 1
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6
F Referenzen zwischen Methoden Java Basics - Anfänger-Themen 5
B Distanz zwischen zwei Punkten Java Basics - Anfänger-Themen 4
D Suche nach der Anzahl von Zonen zwischen zwei Punkten Java Basics - Anfänger-Themen 2
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
S Funktion die mir fuer einen String eine Zahl zwischen 0.0 und 1.0 zurueckliefert..? Java Basics - Anfänger-Themen 9
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
S Leerzeichen zwischen zwei Zeichen im String entfernen Java Basics - Anfänger-Themen 19
N Werte zwischen Klassen austauschen Java Basics - Anfänger-Themen 1
M Unterschied zwischen Classpath eines Eclipse Projektes und dem CLASSPATH? Java Basics - Anfänger-Themen 3
Thallius Best Practice Events zwischen eigenen Klassen Java Basics - Anfänger-Themen 2
A if-Anweisung zwischen zwei Punkten Java Basics - Anfänger-Themen 1
S Erste Schritte TAB-Wechsel zwischen TextFields Java Basics - Anfänger-Themen 1
B Relativer Pfad zwischen zwei Files Java Basics - Anfänger-Themen 2
M Drag & Drop - Interaktion zwischen Java und dem OS Java Basics - Anfänger-Themen 1
S Erste Schritte Tage zwischen 2 Daten berechnen Java Basics - Anfänger-Themen 6
Z Differenz zwischen 2 Daten berechnen, ohne importiere Funktionen! Java Basics - Anfänger-Themen 10
A Datum zwischen zwei Daten berechnen und in Tagen anzeigen Java Basics - Anfänger-Themen 4
D Unterschied zwischen double und Double Java Basics - Anfänger-Themen 4
Q Unterschied zwischen static und keinem Modifier Java Basics - Anfänger-Themen 15
K Unterschied zwischen Jar, war und ear Dateien Java Basics - Anfänger-Themen 3
S Problem bei Kollision zwischen Array-objekten! Java Basics - Anfänger-Themen 2
M Länge der Strecke zwischen zwei Punkten Java Basics - Anfänger-Themen 10
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
T zwischen den Strings soll ein plus(+) stehen Java Basics - Anfänger-Themen 5
S Methoden Tage zwischen 2 Daten Java Basics - Anfänger-Themen 19
M Typcasting zwischen ganzen Zahlen Java Basics - Anfänger-Themen 7
K Unterschied zwischen break und continue in einer Schleife Java Basics - Anfänger-Themen 14
A Exakte Unterschied zwischen Java EE und Java SE? Java Basics - Anfänger-Themen 4
J Unterschied zwischen statische und nicht statische Methoden? Java Basics - Anfänger-Themen 14
N Winckel zwischen zwei Punkten Java Basics - Anfänger-Themen 9
O Java unterschied zwischen Interface und Interface_Referenzen!!?? Java Basics - Anfänger-Themen 7
J Regex um Inhalte zwischen Tags zu ignorieren Java Basics - Anfänger-Themen 2
F Info zwischen verschiedene Klassen austauschen Java Basics - Anfänger-Themen 4
W Variablen zwischen Klassen übertragen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben