# Winkel berechnen



## Perplex (26. Mai 2005)

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:


```
-----------------
 |                |
 |        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 (26. Mai 2005)

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 (26. Mai 2005)

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 (26. Mai 2005)

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 (26. Mai 2005)

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:


```
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 (26. Mai 2005)

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 (26. Mai 2005)

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?


----------



## mic_checker (26. Mai 2005)

Könnte sein das es daran liegt das du dadurch den eingeschlossenen Winkel kriegst,also den Innenwinkel. In diesen Fällen müsstest du dann wohl den Aussenwinkel holen.



> w2 = 2*pi - w1


Steht auch in Benis Text.


----------



## Perplex (26. Mai 2005)

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

Hab's jetzt so:

```
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 (27. Mai 2005)

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

Ich drehe ein rechteck :

```
g2d.rotate(theta,rechteck.getCenterX(), rechteck.getCenterY());
```

den Winkel theta berechne ich so:

```
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 (27. Mai 2005)

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 (27. Mai 2005)

Hab das Problem gelöst!


```
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!!


----------



## raffnix (29. Mai 2005)

wie würde es denn mit einem Winkel zu Y Achse aussehen??
muss da viel geändert werden??


----------



## Perplex (30. Mai 2005)

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 (30. Mai 2005)

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 (30. Mai 2005)

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 (1. Jun 2005)

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 (1. Jun 2005)

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.




```
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);
```


----------



## Guest (5. Mrz 2007)

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


----------

