![]() |
Polygon drehen
Ich bräuchte bei meinem Delphi-Programm mal Hilfe!
Zum Programm: Es sollen Punkte auf dem Bildschirm markiert werden und daraus ein Polygonzug erstellt werden. Und der zweite Teil der Aufgabe besteht daraus diesen Polygonzug im Punkt 1 mit dem Winkel w zu drehen. Die Sache mit dem Polygonzug habe ich hinbekommen, das stellte kein Problem dar. Nun dachte ich mir wegen den zweiten Teil der Aufgabe, dass ich die Punkte erstmal um den Ursprung verschiebe, sie neu zeichnen lasse und danach den Polygonzug wieder verbinde. Sollte das dann funktionieren würde ich es um den Punkt 1 drehen lassen. Jedoch bekomme ich es einfach nicht hin, mir ist die geometrische Transformation schon bewusst und rein theoretisch ist mir das auch klar, aber ich bekomme es leider nicht umgesetzt. Ich hoffe ich bin nicht auf den Holzweg mit meiner Idee die Punkte zu "verschieben" und anschließend den Polygon neuzuzeichnen..:?: Punkte für den Polygonzug setzen:
Delphi-Quellcode:
Polygonzug verbinden:
procedure TForm4.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin image1.Canvas.Pen.Color:=clblack; image1.Canvas.brush.Style:=bsclear; if button=mbLeft then begin n:=n+1; xp[n]:=x; yp[n]:=y; image1.Canvas.Rectangle(x-3,y-3,x+3,y+3); end; end;
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var i:integer; begin n:=n+1; xp[n]:=xp[1]; yp[n]:=yp[1]; image1.canvas.moveto (xp[n],yp[n]); for i:=n+1 to n-1 do image1.Canvas.MoveTo(xp[i],yp[i]); for i:=1 to n-1 do image1.canvas.lineto (xp[i+1], yp[i+1]); end; Vielen Dank schonmal!! |
AW: Polygon drehen
Erst die Vektoren relativ zu dem Punkt ausrechnen, um den gedreht werden soll, also z.B:
Code:
Dann mit der Drehmatrix multiplizieren, war glaube ich:
P_relativ[i]:=P[i]-P1
Code:
Also:
M = ( Cos(alpha) Sin(alpha) )
( -Sin(Alpha) Cos(Alpha) )
Code:
So in etwa müsste es funktionieren.
P_gedreht = M * P_relativ
|
AW: Polygon drehen
Das stammt aus meiner Sammlung :
Delphi-Quellcode:
RVektor = record
x, y: Double; end; // WZ = Winkel function Rotate(WZ : Double; Vektor : RVektor): RVektor; begin result.x := Vektor.x * cos(degtorad(WZ)) - Vektor.y * sin(degtorad(WZ)); result.y := Vektor.x * sin(degtorad(WZ)) + Vektor.y * cos(degtorad(WZ)); end; |
AW: Polygon drehen
Zitat:
|
AW: Polygon drehen
Hallo! Ich habe die selbe Aufgabe, jedoch ein etwas anderes Problem!
der debugger zeigt mir eine fehlermeldung an: die dateitypen seien inkompatibel. ich soll es wohl als integer deklariert haben. jedoch wird der code in extendet gerechnet. Zitat:
Zitat:
|
AW: Polygon drehen
Zitat:
Delphi-Quellcode:
var
u,v,y,x,w: double; // oder single / extended / real n,i:integer; // i ist eine schleifenvariable, also integer. n anscheinend auch. aber wo wird die gesetzt? in deinem code nicht... xp,yp:array[1..100]of integer; // wenn das auch zahlen mit nachkommastellen sein können, dann auch hier double / single / extended / real... oder ich versteh nicht, wo nun das problem sein soll? Edit: Noch was zum Unterschied der Fliesskomma-Typen: Single Genauigkeit: 7–8 Nachkommastellen , Speichergrösse: 4 Byte Double / Real Genauigkeit: 15–16 Nachkommastellen , Speichergrösse: 8 Byte Extended Genauigkeit: 19–20 Nachkommastellen , Speichergrösse: 10 Byte |
AW: Polygon drehen
Siehe auch Code-Library:
![]() |
AW: Polygon drehen
Wenn x und y integer sind, ist es folgerichtig, wenn u und v auch integer sind.
x,y,u,v: array [1..100] of integer;
Delphi-Quellcode:
Procedure Transformiere (const x,y: integer; w: double; var u,v: integer);
begin w:= w * 3.1416/180; u := Round( x * cos (w) + y * sin(w)); v := Round( -x * sin (w) + y * cos(w)); end;
Delphi-Quellcode:
for i := 1 to n do
Transformiere (x[i], y[i], spinedit1.value, u[i], v[i]); Wenn x und y double sind, ist es folgerichtig, wenn u und v auch double sind. x,y,u,v: array [1..100] of double;
Delphi-Quellcode:
Procedure Transformiere (const x,y: double; w: double; var u,v: double);
begin w:= w * 3.1416/180; u := x * cos (w) + y * sin(w); v := -x * sin (w) + y * cos(w); end;
Delphi-Quellcode:
for i := 1 to n do
Transformiere (x[i], y[i], spinedit1.value, u[i], v[i]); |
AW: Polygon drehen
@Bjoerk ich würde die Prozedure nicht "Transformiere" sondern "Rotiere" nennen.
Aber ich möchte doch nochmal auf meinen vorherigen Beitrag verweisen. Eleganter kann man es eigentlich nicht programmieren. Das es sich bei Rotate2D und Translate2D um Funktionen handelt, kann man sie problemlos verketten:
Delphi-Quellcode:
Durch die Verwendung des Records TPoint wird der Code leichter lesbar.
// verschieben, drehen um 45 Grad und zurückverschieben
NeuPunkt := Translate2D(Rotate2D(Translate2D(orgPunkt, P2), DegToRad(45.0)), invP2); Bleibt man bei x und y, braucht man doppelt so viele Variablen. Man kann aus den Verschiebungen und Drehungen auch eine ![]() Dann kann man diese Transformationsmatrix auf alle Punkte anwenden und spart so Rechenzeit. Dafür ist dann die nötige Mathematik etwas aufwändiger. |
AW: Polygon drehen
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend!
Also im Anhang habe ich mal einen Screenshot angehängt. In ihm sieht man halt unten in dieser Berichtigungszeile, dass inkompatible Typen auftreten. Und zwar in den Zeilen vom Code:
Delphi-Quellcode:
Ich habe dann natürlich erstmal gegoogelt was das bedeutet. Weiss da aber irgendwie nicht weiter.
w:=spinedit1.value;
for i:=1 to n do begin u:=yp[n]*sin(w)+xp[n]+cos(w); v:=yp[n]+cos(w)-xp[n]+sin(w); Das ist aber nur mein Teilproblem. Außerdem weiss ich nicht wie ich die Kooridanten u und v wieder in das array bekommen soll (für alle anderen punkte) und deses dann wieder zeichnen soll. Aber das ist erstmal ein anderer Schuh. EDIT: also ich muss sagen, dass ich ecuh n bissl bewundere. ich schu mir gerade so die angebotenen quelltexte an und finde es ziemlich kompliziert sich in andere quelltexte reinzufuchsen. auch wegen der unterschiedlich definierten variablen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz