![]() |
Canvas Zeichnung drehen
Hallo ich wollte fragen ob es irgendwie möglich ist eine canvas zeichnung um 90 grad zu drehen!?
wollte z.b.: diese männchen hier so drehen das es auch sieht als ob es liegt ;)
Delphi-Quellcode:
Form1.Canvas.Ellipse(xpos-10,510,xpos+10,530);
Form1.Canvas.moveto(xpos,530); Form1.canvas.LineTo(xpos,560); |
Re: Canvas Zeichnung drehen
90° in welche Richtung? Im einen Fall einfach X/Y-Koordinaten tauschen.
Dust Signs |
Re: Canvas Zeichnung drehen
richtung ist miregal soll sich halt hinlegen so das männchen... das problem besteht heirbei nur das das flüssig aussehen soll also soll es in mehreren schritten geschenen...
das heißt das man auch sieht wie das männchen sich "hinlegt"... weisst du wie man das machen kann? normale bnidler darf ich ledier nicht benutzen ;) |
Re: Canvas Zeichnung drehen
Einen Timer vielleicht? Dann klappt das mit dem Tauschen der Koordinaten aber nicht mehr.
Dust Signs |
Re: Canvas Zeichnung drehen
![]() Mit diesen Funktionen kannst du einen Punkt um den Ursprung drehen. Wenn du um einen anderen Punkt drehen möchtest, dann musst du den Punkt zuerst verschieben, dann drehen und wieder zurückverschieben. |
Re: Canvas Zeichnung drehen
ah das sieht ja schon mal gut aus danke für die hilfe da ich aber grade erst mit delphi angefangen habe weiss ich nicht genau wie ich mein männchen da jetz einbringen soll... ist mir alles ein wenig unübersichtlich..könntest du mir das ein wenihg veranschaulichen?
|
Re: Canvas Zeichnung drehen
so habe jetz das männchen fertig und muss es nur noch drehen dafür soll eine procedure Tmann2.hinlegen in meiner klasse tmann2 erstellt werden...
das ist der bisherige code :
Delphi-Quellcode:
also wie dreh ich das jetz mti dieser funktion weiss echt nicht wie ich das machen soll!?
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Math; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type TMann2 = class xpos,ypos : integer ; constructor create(Mx,My :integer); procedure Normal; end; var Form1: TForm1; Mann2: TMann2; implementation {$R *.dfm} procedure TMann2.Normal; begin Form1.Canvas.Ellipse(xpos-10,ypos,xpos+10,ypos+20); Form1.Canvas.Moveto(xpos,ypos+20); Form1.Canvas.LineTo(xpos,ypos+50); Form1.Canvas.LineTo(xpos+10,ypos+70); Form1.Canvas.Moveto(xpos,ypos+50); Form1.Canvas.LineTo(xpos-10,ypos+70); Form1.Canvas.Moveto(xpos,ypos+25); Form1.Canvas.LineTo(xpos-5,ypos+45); Form1.Canvas.Moveto(xpos,ypos+25); Form1.Canvas.LineTo(xpos+5,ypos+45); end; constructor TMann2.create (Mx,My:integer); begin xpos:=Mx; ypos:=My; end; procedure TForm1.Button1Click(Sender: TObject); begin Mann2:=TMann2.create(400,300); Mann2.Normal; end; end. |
Re: Canvas Zeichnung drehen
Delphi-Quellcode:
sowas da ? (is nur kurz skizziert)
function RotateCCW(position,axis: TPoint; alpha: single): TPoint;
var relative: TPoint; begin relative := Point(position.x - axis.x,position.y - axis.y); result.x := axis.x + round(relative.x*cos(alpha) - relative.y*sin(alpha)); result.y := axis.y + round(relative.x*sin(alpha) + relative.y*cos(alpha)); end; edit: jaja.. die fehlerchen... |
Re: Canvas Zeichnung drehen
weiss ich ja nicht genau ich weiss nicht genau was diese funktion bewirkt... deswegen wäre ich echt über ein wenig hilfe dankbar oder wäre es jetz viel arbeit dieses männchen mit der funktion zum drehen zu erweitern..wäre echt eine super hilfe....
|
Re: Canvas Zeichnung drehen
eins vorab: Vorzeichenfehler nicht ausgeschlossen ;)
Ich weiß ja nicht wie Fit du in Mathe bist, aber die Funktion wendet nur eine Rotationsmatrix an. Versuch dir jetzt mal ein normales Koordinatensystem vorzustellen, in dem ein Punkt (2|1) eingezeichnet ist. Jetzt rotiere ich den Punkt um 30° am Ursprung neues x = 2 *cos(30°) - 1 *sin(30°) neues y = 2 *sin(30°) + 1 *cos(30°) sin(30°) = 0.5 cos(30°) = wurzel(3)/2 = ~ 1.732 / 2 neues x = 2 *(1.732 / 2) - 1 *0.5 neues y = 2 *0.5 + 1 *(1.732 / 2) neues x = 1.732 -0.5 = 1.232 neues y = 1 + 0.866 = 1.866 damit ist dein Punkt bei (1.232|1.866) wenn dus dir aufzeichnest, siehste, dass die zwei halbgeraden vom Ursprung aus den Winkel 30° einschließen. Edit: Sprachfehler entfernt *duck* |
Re: Canvas Zeichnung drehen
Die funktion ist doch relativ selbsterklärend:
Delphi-Quellcode:
position ist der Punkt den du drehen willst.
function RotateCCW(position,axis: TPoint; alpha: single): TPoint;
axis ist der Punkt um den gedreht werden soll alpha ist der Drehwinkel um die Figur zu drehen musst du einfach für jeden Punkt die funktion aufrufen und den Rückgabewert in deiner zeichenprocedure verwenden. Um die figur langsam zu drehen musst du alpha z:B. in einem timer erhöhen und dann jeweils das Mänchen neuzeichnen. mfg, Ratte |
Re: Canvas Zeichnung drehen
mhmm.... ok doch wie wende ich jetzt diese schöne funktion auf alle punkte meines männchens an?
kann man die innerhalb einer procedure aufrufen oder wie? |
Re: Canvas Zeichnung drehen
naja mit der ellipse wirds schwerer, aber die Linien gehen so:
Delphi-Quellcode:
a: single;
[...] procedure TMann2.zeichnen; var axis: TPoint; p : TPoint; begin axis := Point(xpos + 8, ypos + 50); [...] p := RotateCCW(Point(xpos,ypos+20),axis,a); Form1.Canvas.Moveto(p.x,p.y); p := RotateCCW(Point(xpos,ypos+50),axis,a); Form1.Canvas.LineTo(p.x,p.y); [...] |
Re: Canvas Zeichnung drehen
ouh man hab versucht das bei mir einzubidnen aber ich bekomme es echt nicht zum laufen..ich bin echt total am verzweifeln wäre vllt. einer so lieb und könnte das für mich amchen.. scheint ja nicht all zu viel arbeit zu sein....
wäre echt super.... :( |
Re: Canvas Zeichnung drehen
weil ich heut meinen guten Tag hab ;)
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Math; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type TMann2 = class xpos,ypos : integer; a : single; axis: TPoint; constructor create(Mx,My :integer); procedure zeichnen(Winkel: single = 0); end; var Form1: TForm1; Mann2: TMann2; implementation {$R *.dfm} function RotateCCW(position,axis: TPoint; alpha: single): TPoint; var relative: TPoint; begin relative := Point(position.x - axis.x,position.y - axis.y); result.x := axis.x + round(relative.x* cos(alpha) + relative.y*sin(alpha)); result.y := axis.y + round(relative.x*-sin(alpha) + relative.y*cos(alpha)); end; procedure TMann2.zeichnen(Winkel: single = 0); var p: TPoint; begin a := winkel; form1.Repaint; p := RotateCCW(Point(xpos,ypos+10),axis,a); Form1.Canvas.Ellipse(p.x-10,p.y-10,p.x+10,p.y+10); p := RotateCCW(Point(xpos,ypos+20),axis,a); Form1.Canvas.Moveto(p.x,p.y); p := RotateCCW(Point(xpos,ypos+50),axis,a); Form1.Canvas.LineTo(p.x,p.y); p := RotateCCW(Point(xpos+10,ypos+70),axis,a); Form1.Canvas.LineTo(p.x,p.y); p := RotateCCW(Point(xpos,ypos+50),axis,a); Form1.Canvas.Moveto(p.x,p.y); p := RotateCCW(Point(xpos-10,ypos+70),axis,a); Form1.Canvas.LineTo(p.x,p.y); p := RotateCCW(Point(xpos,ypos+25),axis,a); Form1.Canvas.Moveto(p.x,p.y); p := RotateCCW(Point(xpos-5,ypos+45),axis,a); Form1.Canvas.LineTo(p.x,p.y); p := RotateCCW(Point(xpos,ypos+25),axis,a); Form1.Canvas.Moveto(p.x,p.y); p := RotateCCW(Point(xpos+5,ypos+45),axis,a); Form1.Canvas.LineTo(p.x,p.y); end; constructor TMann2.create (Mx,My:integer); begin inherited Create; // macht man nunmal so ;) xpos:=Mx; ypos:=My; a := 0; axis := Point(xpos -10, ypos + 70); end; procedure TForm1.Button1Click(Sender: TObject); begin Mann2.Zeichnen; end; procedure TForm1.Button2Click(Sender: TObject); begin while mann2.a < pi/2 do begin mann2.a := mann2.a + 0.05; mann2.zeichnen(mann2.a); sleep(50); end; end; procedure TForm1.FormCreate(Sender: TObject); begin Mann2:=TMann2.create(400,300); end; procedure TForm1.Button3Click(Sender: TObject); begin while mann2.a > 0 do begin mann2.a := mann2.a - 0.05; mann2.zeichnen(mann2.a); sleep(50); end; end; end. aber jetzt bitte keine Fragen mehr. ich hab feierabend :) |
Re: Canvas Zeichnung drehen
gut jetz verstehe ich von dem code zwar eigentlich gar nichts aber ok^^
ich mach mich gleich mla damit schlau ;) |
Re: Canvas Zeichnung drehen
na großer zauberer was macht die kunst?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 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