Autor Beitrag
MrFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 208

WIN 2000 Professional, Ubuntu 5.10
D3 Prof, D7 Pers, D2005 Pers, Java (Eclipse)
BeitragVerfasst: Do 15.12.05 19:52 
Hi,

Mit welcher Formel lässt sich ein Rechteck definiert durch x1,y1,x2,y2:integer um seinen Mittelpunkt drehen?

_________________
Das Leben auf der Erde mag zwar teuer sein, aber eine jährliche Rundreise um die Sonne ist gratis mit dabei.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 15.12.05 20:32 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
var
 p1, p2: TPoint;
 p11, p12, p21, p22: TPoint;
 c, s, alpha, mx, my: Extended;
begin
  p1.X := 100// Koordinaten des Originalvierecks
  p1.Y := 100;
  p2.X := 200;
  p2.Y := 150;
  alpha := 30*pi/180// um 30° im Uhrzeigersinn
  c := cos(alpha);
  s := sin(alpha);
  mx := (p1.X+p2.X)/2// Mittelpunkt
  my := (p1.Y+p2.Y)/2;
  Image1.Canvas.Rectangle(p1.X, p1.Y, p2.X, p2.Y); // Original
  p11.X := Round(c*(p1.x-mx)-s*(p1.y-my)+mx);
  p11.Y := Round(c*(p1.y-my)+s*(p1.x-mx)+my);
  p21.X := Round(c*(p2.x-mx)-s*(p1.y-my)+mx);
  p21.Y := Round(c*(p1.y-my)+s*(p2.x-mx)+my);
  p12.X := Round(c*(p1.x-mx)-s*(p2.y-my)+mx);
  p12.Y := Round(c*(p2.y-my)+s*(p1.x-mx)+my);
  p22.X := Round(c*(p2.x-mx)-s*(p2.y-my)+mx);
  p22.Y := Round(c*(p2.y-my)+s*(p2.x-mx)+my);
  Image1.Canvas.Polygon([p11,p21,p22,p12]); // Gedreht
end;

Falls dich die Herleitung interessiert, lass es mich wissen.
MrFox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 208

WIN 2000 Professional, Ubuntu 5.10
D3 Prof, D7 Pers, D2005 Pers, Java (Eclipse)
BeitragVerfasst: Do 15.12.05 20:45 
Danke. Genau das habe ich gesucht.

_________________
Das Leben auf der Erde mag zwar teuer sein, aber eine jährliche Rundreise um die Sonne ist gratis mit dabei.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Do 15.12.05 20:45 
berechnest du die vektoren um die einzelnen punkte zu verschieben ?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 15.12.05 20:48 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
berechnest du die vektoren um die einzelnen punkte zu verschieben ?

Die Punkte werden verschoben, gedreht mittels Drehmatrix, und anschliessend zurückverschoben. Geht nicht anders.
Bumpy Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Sa 14.01.06 14:04 
user profile icondelfiphan hat folgendes geschrieben:

Falls dich die Herleitung interessiert, lass es mich wissen.


Hi,

ich interessiere mich sehr für die Herleitung, da ich nicht nur abschreiben möchte sondern es auch verstehen! Wäre sehr nett wenn du die noch mal posten könntest.

_________________
-Bumpy Johnson
rest in Peace
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 15.01.06 20:10 
Kennst du dich mit Drehmatrizen bzw. Matrizen im Allgemeinen aus?

Das ganze ist nichts anderes als eine Koordinatentransformation mit gedrehten Koordinatenachsen:
Wenn die Spaltenvektoren einer Matrix M die neuen Koordinatenachsen sind, dann kannst du einen Vektor p in dieses Koordinatensystem bringen, indem du M^-1*p rechnest. Da M orthogonal ist, ist M^T=M^-1.
Die gedrehten Koordinatenachsen kann man durch geometrische Überlegungen und den Definitionen von sin und cos herleiten.

Matrix M =
[cos alpha, -sin alpha]
[sin alpha, cos alpha ]

Falls also p=[px,py], dann ist der gedrehte Vektor p' = M^T*p.

Ausgeschrieben:
px' = cos(alpha)*px-sin(alpha)*py;
py' = sin(alpha)*px+cos(alpha)*py;

Das wär schon alles. Falls du dich mit Matrizen nicht auskennst, kann man es sich auch mit Skalarprodukten herleiten. Du müsstest mir aber schon sagen, auf welchem Stand du genau bist...
Bumpy Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 16.01.06 18:56 
Hi,

Danke erstmal für die Antwort. Aber leider kenne ich mich gar nicht mit Matrizen aus, dafür aber mit Analytische Geometrie und dem Skalarprodukt. Wenn du vielleicht so nett wärest und es mir auf dem Weg zu erklären, wäre ich sehr dankbar.

_________________
-Bumpy Johnson
rest in Peace
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 16.01.06 21:18 
Hallo

Es geht eigentlich nur drum, den Vektor p auf die neuen Achsen zu projizieren.
Sei der um alpha zu drehende Vektor p = [px,py] und die üblichen, normalen Koordinatenachsen ex = [1,0] und ey = [0,1].

Dann gilt ganz offensichtlich (Skalarprodukt ausrechnen):
px = p*ex
py = p*ey

Wenn man p auf die normalen Koordinatenachsen projiziert, erhält man die Koordinaten px und py.

Das ganze Spielchen funktioniert natürlich auch, wenn die Koordinatenachsen gedreht sind:
Seien ex' und ey' gedrehte Koordinatenachsen (siehe rechts, grün im Bild).

user defined image

Projiziert man nun p auf ex' bzw. ey', erhält man die Koordinaten "vom gedrehten System aus betrachtet".
Es gilt analog zu oben:
px' = p*ex'
py' = p*ey'

Die Koordinaten im gedrehten System heissen also p'=[p*ex',p*ey'].

Nun muss man also nur noch ex' und ey' haben!
Die lauten ganz einfach: ex'=[cos(alpha),sin(alpha)] und ey'=[-sin(alpha),cos(alpha)].

Wieso? Wenn du dir die gedrehten Achsen im Einheitskreis aufzeichnest und die Winkel einzeichnest, siehst du es.

Mathematisch ohne Skizze:
1.) ex bildet mit ex' den Zwischenwinkel alpha, denn: ex*ex'=[1,0]*[cos(alpha),sin(alpha)]=cos(alpha), nach Definition des Skalarproduktes ist alpha also tatsächlich der Zwischenwinkel.
2.) ex'*ey'=0, d.h. ey' steht senkrecht zu ex'.

So, alles eingesetzt also:
px' = p*ex' = px*cos(alpha)+py*sin(alpha)
py' = p*ey' = -py*sin(alpha)+py*cos(alpha)

Falls jetzt die Vorzeichen mit oben nicht übereinstimmen macht das nichts; dann geht die Drehung halt einfach in die vekrehte Richtung.
Bumpy Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 15.03.06 14:25 
Hi,

Ich hab es mal geschafft mich intensiv mit dem Thread auseinandersetzen!
Alles ist auch soweit in Ordnung und funktioniert auch! Aber wenn ich jetzt ein gedrehtes Polygon noch mal drehen will, sieht das nicht mehr so gut aus! Entweder ist die Größe total falsch oder es fällt total ineinanderzusammen!

Hat wer ein Tipp woran das liegen kann?

_________________
-Bumpy Johnson
rest in Peace
MrFox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 208

WIN 2000 Professional, Ubuntu 5.10
D3 Prof, D7 Pers, D2005 Pers, Java (Eclipse)
BeitragVerfasst: Mi 15.03.06 15:43 
Das sollte man grundsätzlich nicht machen. Immer das Ursprungsrechteck merken und von dort aus drehen.
Liegt daran, dass beim drehen Rundungsfehler auftreten, dreht man einmal, fällt das nicht ins Auge, dreht man allerdings mehrmals, summieren sich die Fehler und man sieht's.

//Edit
Und zusätzlich ist mir eingefallen: Die Funktion dreht nur Rechtecke zu Polygons. Polygons lassen sich mit der Funktion nicht drehen.

_________________
Das Leben auf der Erde mag zwar teuer sein, aber eine jährliche Rundreise um die Sonne ist gratis mit dabei.
Bumpy Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 15.03.06 17:27 
Naja, Polygon kann man schon drehen. Man muss halt nur wissen welche Punkte das Rechteck bestimmen! Aber danke für deine Antwort! Dann muss ich das Ganze halt ein bisschen anders machen

_________________
-Bumpy Johnson
rest in Peace