Winkel berechnen

Status
Nicht offen für weitere Antworten.

Perplex

Mitglied
Hallo, ich habe folgendes Problem:

Ich zeichne ein Rechteck auf einem geladenen Bild und möchte den Winkel zwischen der Ausrichtungsachse des Rechtecks und der x-Achse berechnen.
Also vom Mittelpunkt der unteren Seite des Rechtecks zum mittelpunkt wird noch zusätzlich eine Linie eingezeichnet, die die Ausrichtung des Rechteck s anzeigt, etwa so:

Code:
 -----------------
 |                |
 |        1       |
 |        o       |
 |        |       |
 |        |       |
 ---------o-------
         2

Nun soll der Winkel zwischen der Linie von Punkt 2 zu Punkt 1 und der x-Achse berechnet werden.
Der Winkel soll im Bereich [0° 360° [ liegen und eine Orientierung gegen den Uhrzeigersinn haben.

Man bekommt sicher den Winkel mit cosinus, aber ich weiss nicht, wie ich die x-Achse da in die Berechnung miteinbeziehe.

Bin für jede Hilfe dankbar!
 

mic_checker

Top Contributor
Du willst Punkt P1 (linke untere Ecke) mit Punkt P2 Mittelpunkt Ausrichtungsachse verbinden und den Winkel zwischen der resultierenden Geraden und der x-Achse berechnen.

Richtig so?

Vielleicht hilft dir Benis Text zu Vektoren,Geraden etc..

Falls ich was falsch verstanden hab sag bescheid.
 

Perplex

Mitglied
Hi,

vielen Dank für die antwort!!

nein, ich habe ein Programm geschrieben, mit dem man Objekte auf einem geladenen Bild markieren kann. Dazu zeichnet man ein Rechteck um dieses Objekt. Die Linie zwischen punkt 2 und Punkt 1 in meinem Bild wird auch gezeichnet und soll die Ausrichtung dieses Objektes markieren. Nun will ich den Winkel zwischen dieser Linie und der x-Achse berechnen. Das Rechteck kann auch schief stehen, ich hab's einfach nur gerade aufgemalt, weil's einfacher war :)

Mit dem Winkel soll ja die Ausrichtung des Objektes angegeben werden.

Die linke und die rechte Seite des Rechtecks sind dabei immer parallel zu der Linie zwischen Punkt 2 und 1.

Hab mir den Text mal durchgelesen, hab aber immer noch keine Ahnung, wie ich's machen soll.
 

mic_checker

Top Contributor
Du hast die beiden Punkte, du verbindest die beiden Punkte und kannst so den "Verbindungsvektor" berechnen. Dann noch für die x-Achse einen Vektor und einfach den Winkel zwischen zwei Vektoren bestimmen wie oben beschrieben....
 

Perplex

Mitglied
Das Problem ist nur, dass ich nicht weiss, wie ich Vektoren in java aufschreibe.
D.h. wie stelle ich disen Verbindungsvektor dar und den für die x-Achse?

Ich hab's jetzt so gemacht:

Ich habe die x-Differenz zwischen Punkt 1 und Punkt 2 berechnet und den Abstand zwischen Punkt 1 und 2 und dann den arcus cosinus von (x-Differenz / Abstand zwischen Punkt 1 und 2)
berechnet. Das liefert mir eine Zahl, die ein Vielfaches von PI ist, also im Bogenmass. Ich will aber die Zahl im Winkelmass, also als Grad-Zahl. Hab's mit dem Dreisatz versucht, klappt aber nicht.

Hier ist mal mein Code:

center entspricht Punkt 1 und wrist entspricht Punkt 2:

Code:
 public double getAngle() {
 	double distCentWristX = center.getX() - wrist.getX();
   double getangle = Math.acos( distCentWristX /center.distance(wrist));
    double x = (getangle * 360 ) / 2*Math.PI;
    return x;
 }

So klappt die Umwandlung in Winkelmass jedenfall nicht.
Hast Du ne Idee, wie man's richtig macht?
 

mic_checker

Top Contributor
Klappt die Umrechnung Bogenmaß ins Winkelmaß nicht? Falls es das ist:

360° = 2 PI

Zum Verbindungsvektor etc:
Der V.Vektor von P1 zu P2 berechnet sich durch P2 - P1, die x-Achse kannst du ja ähnlich ausdrücken, einfach linkeren unteren Punkt holen und z.B. rechten unteren Punkt (wenn das Rechteck nicht schön gerade sondern auch mal schief dargestellt sein kann).

Btw. probier das ganze doch mal mit Werten die du auf dem Blatt nachvollziehen kannst ,stell dann die Vektoren selbst nochmal dar und überprüfe ob der selbe Winkel rauskommt....
 

Perplex

Mitglied
Alles klar, hab's jetzt!

Ich hatte einfach keine Klammer um 2 * Math.PI gemacht!
Aber jetzt ist es so, dass es von 0 bis 180 Grad klappt, wenn ich das Rechteck an Punkt 1 um Punkt 2 von rechts nach links drehe (also gegen den Uhrzeigersinn).Aber sobald ich den 180°-Punkt überschreite, wird der Winkel von 180° an wieder rückwerts gezählt bis zu 0°. Ich will aber, dass beim Drehen gegen den Uhrzeigersinn auch 180° bis 359° als aktueller Winkel angezeigt wird.
Hast Du da nen Vorschlag?
 

Perplex

Mitglied
Also ich wollte, dass wenn der Winkel grösser als 180° ist, dass dann der Aussenwinkel genommen wird.

Hab's jetzt so:
Code:
 public double getAngle() {
 	double distCentWristX = center.getX() - wrist.getX();
 	double distCentWristY = center.getY() - wrist.getY();
 	//double y = center.getY();
 	double getangle = Math.acos( distCentWristX /center.distance(wrist));
 	//double getangle = Math.acos( distCentWristX /(center.distance(wrist)*(y/Math.abs(y))));
 	double x = (getangle * 360 ) / (2*Math.PI);
 	if (x> 180.0){
 	double	y = (2*Math.PI) - ((getangle * 360 ) / (2*Math.PI));
 	return y;
 	}
 else {
 	return x;
 
 }
 }

Aber so klappt's nicht!
Ich weiss auch nicht, ob man's formal so aufschreiben kann.
Aber so in etwa müsste es funktionieren.
Hast Du da vielleicht ne Idee?
 

raffnix

Bekanntes Mitglied
Ich habe ein ähnliches problem. also poste ich mal einfach hier rein.

Ich drehe ein rechteck :
Code:
 g2d.rotate(theta,rechteck.getCenterX(), rechteck.getCenterY());

den Winkel theta berechne ich so:
Code:
theta =  - Math.atan2(p.x - rechteck.getCenterX(), p.y-rechteck.getCenterY());

ich kann das Rechteck mit der Maus beliebig drehen.
Nun möchte ich gerne wissen wieviel sich das rechteck gedreht hat wenn ich das Drehen beende..
Wie komme ich an diesen Winkel???
müsste ich es so machen wie Perplex oder gibt es da einen anderen Weg??
 

mic_checker

Top Contributor
Im Prinzip kannst du so vorgehen wie Perplex, wenn ich das Problem richtig verstanden hab.

Als ersten Vektor holst du dann anfangs die "Grundlinie" vor dem Drehen und dann das gleiche nochmal nach dem Drehen.....das sollte ja kein Prob sein wenn du die Punkte kennst.

Perplex: ich guck ma ob ich in meinen alten unterlagen was dazu finde, da gabs was, aber man ist so vergesslich .. ;)
 

Perplex

Mitglied
Hab das Problem gelöst!

Code:
 public double getAngle() {
     double distCentWristX = center.getX() - wrist.getX();
     double distCentWristY = center.getY() - wrist.getY();
    double getangle = Math.acos( distCentWristX /center.distance(wrist));
    
    if (wrist.getY() < center.getY()) {
    	
    	getangle = (2*Math.PI) - getangle;
    }
     
     double x = (getangle * 360 ) / (2*Math.PI);
    return x;
 
 }

Hey raffnix, wir arbeiten an dem selben Projekt, oder?
Na ja, so klappt's auf jeden Fall!
Ich denke mal, ich werd das Projekt nicht fertig kriegen! Bin zwar fast fertig, aber ein paar XML-Sachen funktionieren einfach nicht!
Ist echt zum Verzweifeln!

Und mic checker: vielen Dank für die Hilfe!!
 

Perplex

Mitglied
Eigentlich nicht! Aber ich hab's selber auch noch nicht hinbekommen! Man muss aber glaube ich nur beim Aufruf der Methode getAngle() immer 90° abziehen, dann müsste es wieder passen!
 

mic_checker

Top Contributor
Ob du jetzt Winkel mit x-Achse oder mit y-Achse machst ist "egal"....die grundsätzliche Berechnung ist fast gleich, bzw. das Prinzip.

Davon abgesehen : du drehst doch dein Rechteck an einem best. Punkt um einen best. Winkel....dann kannst du ja zur x-Achse oder y-Achse berechnen, ist ja egal....
 

Perplex

Mitglied
Na ja, hab's letzte Nacht leider nicht mehr geschafft, das mit dem Winkel richtig hinzubekommen! Aber ich denke mal, daran wird's nicht scheitern!Eine korrekte Winkelberechnung hab ich ja, eben nur mit dem Nullpunkt rechts statt oben. Wie auch immer, ich hab heute morgen abgegeben und hoffe, dass ich noch die Chance bekomme, das nachbearbeiten zu können. Die wesentlichen Funktionien liefen ja bei mir. Den Punkt in der Aufgabenstellung:" bereits vorhandene Metainformationen sollen visualisiert werden" hab ich jetzt nicht mehr geschafft.Aber die wesentliche Funktion des Programms ist erfüllt.
Keine Ahnung, hoffe, es klappt!!Hab jedenfalls letzte Nacht durchgemacht und noch schnell alles fertiggestellt. Hab dann auch in allerletzter Sekunde abgegeben :) Das war echt knapp!
Jetzt gönn ich mir erst mal ne Auszeit! Hab ich mir wirklich verdient!!
 

raffnix

Bekanntes Mitglied
Irgendwie bekomm ich nicht den aktuellen winkel ausgelesen.
Ich bekomme immer die selben Werte egal wie das rechteck gedreht ist.
Ich habe so die Vermutung, das es an der AffineTransform liegt.
da ich ja das Koordinaten System drehe , bleibt der Winkel immer gleich.
Hat jemand eine Idee wie ich trotzdem an den Winkel komme?? oder wie ich das Koordinaten Systrem zurückdrehen kann ohne das sich auch mein Rechteck zurück dreht???
 

raffnix

Bekanntes Mitglied
Juchuu gerade was entdeckt. durch rumprobieren habe ich rausgefunden,
dass ich den mit Perplex formel erstellten Winkel mit dem Rotationswinkel theta so Modifizieren kann, das korrekte Werte herauskommen.

Ich schreibe es mal hin für alle die es Interessiert.



Code:
public double processAngle(Point p1, Point p2) {
    double distX = p1.getX() - p2.getX();
    double distY = p1.getY() - p2.getY();
   double alpha = Math.acos( distX /p1.distance(p2));
  
   if (p2.getY() <p1.getY()) {
      
      alpha = (2*Math.PI) - alpha;
   }
    
    double actualrot = (alpha * 360 ) / (2*Math.PI);
   return actualrot;

}

// theta ist der Winkel der AffineTransform


angle = processAngle(p1, p2)/(Math.PI/theta);
 
G

Guest

Gast
raffnix hat gesagt.:
Juchuu gerade was entdeckt. durch rumprobieren habe ich rausgefunden,
dass ich den mit Perplex formel erstellten Winkel mit dem Rotationswinkel theta so Modifizieren kann, das korrekte Werte herauskommen.

Ich schreibe es mal hin für alle die es Interessiert.



Code:
public double processAngle(Point p1, Point p2) {
    double distX = p1.getX() - p2.getX();
    double distY = p1.getY() - p2.getY();
   double alpha = Math.acos( distX /p1.distance(p2));
  
   if (p2.getY() <p1.getY()) {
      
      alpha = (2*Math.PI) - alpha;
   }
    
    double actualrot = (alpha * 360 ) / (2*Math.PI);
   return actualrot;

}

// theta ist der Winkel der AffineTransform


angle = processAngle(p1, p2)/(Math.PI/theta);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G winkel berechnen AWT, Swing, JavaFX & SWT 4
J Winkel AWT, Swing, JavaFX & SWT 2
Tippster JavaFX Scene neu berechnen lassen AWT, Swing, JavaFX & SWT 5
W JavaFX Button - optimale Breite berechnen AWT, Swing, JavaFX & SWT 1
Z Swing Kann man denn abstand zwischen zwei Buttons berechnen AWT, Swing, JavaFX & SWT 5
Neumi5694 Größe von Komboboxen neu berechnen AWT, Swing, JavaFX & SWT 3
A Swing JFrame neuzeichnen lassen, position neu berechnen lassen? AWT, Swing, JavaFX & SWT 9
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
F Schriftgröße von Buchstaben berechnen AWT, Swing, JavaFX & SWT 3
B 2D-Grafik Collision berechnen AWT, Swing, JavaFX & SWT 2
H preferred size abhängig von Fenstergröße berechnen AWT, Swing, JavaFX & SWT 11
S Farbverlauf in for-Schleife berechnen AWT, Swing, JavaFX & SWT 4
M Swing JTextField "onthefly" auslesen und berechnen AWT, Swing, JavaFX & SWT 7
D Swing JViewPort, Absolut Koordinaten berechnen. AWT, Swing, JavaFX & SWT 2
A AWT HSB-Farben dynamisch berechnen AWT, Swing, JavaFX & SWT 5
T Swing JEditorPane Groesse berechnen AWT, Swing, JavaFX & SWT 2
C Alternative zu getFontMetrics um Stringlänge zu berechnen AWT, Swing, JavaFX & SWT 2
Schandro Den größten passenden java.awt.Font zu einem Rectangle berechnen AWT, Swing, JavaFX & SWT 2
M Animation berechnen AWT, Swing, JavaFX & SWT 4
D Koordinaten von einem Kreissegment berechnen AWT, Swing, JavaFX & SWT 6
T Breite des Containers ist gegeben - wie die Höhe berechnen? AWT, Swing, JavaFX & SWT 3
J Schriftgröße aus vorhandenem Platz berechnen AWT, Swing, JavaFX & SWT 9
J resize eines Bildes automatisch berechnen lassen? AWT, Swing, JavaFX & SWT 2
C Farblayer berechnen AWT, Swing, JavaFX & SWT 24

Ähnliche Java Themen

Neue Themen


Oben