Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas Zeichnung drehen (https://www.delphipraxis.net/70621-canvas-zeichnung-drehen.html)

Gnaaman 1. Jun 2006 17:18


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

Dust Signs 1. Jun 2006 17:29

Re: Canvas Zeichnung drehen
 
90° in welche Richtung? Im einen Fall einfach X/Y-Koordinaten tauschen.

Dust Signs

Gnaaman 1. Jun 2006 17:31

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

Dust Signs 1. Jun 2006 17:33

Re: Canvas Zeichnung drehen
 
Einen Timer vielleicht? Dann klappt das mit dem Tauschen der Koordinaten aber nicht mehr.

Dust Signs

shmia 1. Jun 2006 17:33

Re: Canvas Zeichnung drehen
 
http://www.delphipraxis.net/internal...ct.php?t=38391
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.

Gnaaman 1. Jun 2006 17:37

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?

Gnaaman 1. Jun 2006 18:36

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:
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.
also wie dreh ich das jetz mti dieser funktion weiss echt nicht wie ich das machen soll!?

hboy 1. Jun 2006 18:56

Re: Canvas Zeichnung drehen
 
Delphi-Quellcode:
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;
sowas da ? (is nur kurz skizziert)


edit: jaja.. die fehlerchen...

Gnaaman 1. Jun 2006 19:00

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

hboy 1. Jun 2006 19:13

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*

Ratte 1. Jun 2006 19:14

Re: Canvas Zeichnung drehen
 
Die funktion ist doch relativ selbsterklärend:
Delphi-Quellcode:
function RotateCCW(position,axis: TPoint; alpha: single): TPoint;
position ist der Punkt den du drehen willst.
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

Gnaaman 1. Jun 2006 19:30

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?

hboy 1. Jun 2006 19:41

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);
[...]

Gnaaman 1. Jun 2006 19:56

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

hboy 1. Jun 2006 20:20

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 :)

Gnaaman 1. Jun 2006 20:47

Re: Canvas Zeichnung drehen
 
gut jetz verstehe ich von dem code zwar eigentlich gar nichts aber ok^^

ich mach mich gleich mla damit schlau ;)

hboy 2. Jun 2006 15:44

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