Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Polygon auf Canvas Drehen (https://www.delphipraxis.net/65214-problem-mit-polygon-auf-canvas-drehen.html)

TiPi 13. Mär 2006 23:25


Problem mit Polygon auf Canvas Drehen
 
Hallo erstmal :-),

Ich möchte ein selbsterstelltes Polygon in einem Canvas Drehen.

Hier erstmal der Grundquelltext für das Drehen:

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
begin
  winkel:=strtofloat(edit3.Text);     //umrechnen in pi und volle drehung der winkel

   if winkel <= 180 then  hwink:=((winkel/180)*pi)
        else  hwink:=-(((winkel-180)/180)*pi) ;
        swink:=sin(hwink);
         for k:=1 to (n-1) do
          begin
            //x-werte differenz zu letztem n punkt last!!
                  //letzten punkt holen
                 //mit x-werte subtrahieren
          xdel:=xp[n-k]-xp[last];      //delta x wert n-k
          ydel:=yp[n-k]-yp[last];     //delta y wert
           //vorzeichen bestimmen
           if xdel>0 then xvorz:=true else xvorz:=false;
           if ydel>0 then yvorz:=true else yvorz:=false;

                                     //berechnung neuerwert sin bzw,cos
           lange:=sqrt((xdel*xdel)+(ydel*ydel));
          // lange:=round(lange);
           winklast:=(radtodeg(arctan(ydel/xdel)));//winkel von last x-achse zu punkt
           //4.quadrant
           if (xvorz and yvorz)=true then drehw:=winklast - winkel; //4.quadrant

           //3.quadrant
           if xvorz=false then              //3.quadrant
           begin
           if yvorz=true then drehw:=180+winklast - winkel;
           end;

           //2.quadant
           if xvorz=false then                //2.quadrant
           begin
           if yvorz=false then drehw:=180+winklast-winkel;
           end;

           //1.quadrant
           if xvorz=true then
           begin
           if yvorz=false then  drehw:=(winklast-winkel);
           end;

           //drehw:=winklast - winkel;     //winkel nach drehung um winkel zur x durch last
           drehw:=degtorad(drehw);      //drehwinkel x achse in rad
                                         //richtungssinn  der winkel
           xs[1]:=xp[last];
           ys[1]:=yp[last];
           xs1:=(xp[last]+(lange*(cos(drehw))));
           xs[k+1]:=round(xs1);                  //K
           ys1:=(yp[last]-(lange*(-sin(drehw))));
           ys[k+1]:=round(ys1);
           //end;

          //  for a:=1 to h do
           // begin
           // xs[k]:=xs[n-k];
           // ys[k]:=ys[n-k];
           // end;

          //dist:='x '+floattostr(xs[k])+' y '+floattostr(ys[k]);
          //listbox2.items.Add(dist);

            dist:=floattostr(n-k)+' '+'x '+floattostr(xs[k+1])+' y '+floattostr(ys[k+1]);
          listbox2.items.Add(dist);


             // if siny2 >0  then  xs[k]:=xp[n-k]+sinx2  ;
              //s[k]:=yp[n-k]y-siny2 ;

          //if ydel>0   then  ys[k]:=yp[n-k]+siny2
            //      else      ys[k]:=yp[n-k]-siny2; //neue y koordinate
           image1.canvas.pen.color:=clred;
          image1.canvas.rectangle(xs[k+1]-3,ys[k+1]-3,xs[k+1]+3,ys[k+1]+3); //k
          end;
          //zeichnen der gedrheten figur
           for k:=1 to (n-1) do
          begin
           image1.canvas.moveto(xs[k],ys[k]);
           image1.canvas.lineto(xs[k+1],ys[k+1]);
             end;
           image1.canvas.moveto(xs[n],ys[n]);
           image1.canvas.lineto(xs[1],ys[1]);

           // image1.canvas.brush.style:=bsclear;
            image1.canvas.pen.color:=clblack;
end;
Das Drehen um den letzten Punkt habe ich nach vielen Versuchen endlich Hinbekommen das Problem ist aber ich muss des ding um den ersten Punkt drehen :(

Bekomme des aber nach tagelangem versuchen immer noch nicht hin.


Kann mir da jemand helfen mit nem Kleinem Tipp wo und wie ich da jetzt ansetzen sollte.

sollte der rest des Quellcodes noch gebraucht werden bitte sagen! der ist dann nicht mehr so lang :)


Danke für die Hilfe



Wenn ich alles wüßte wäre, ich gott bin ich aber nicht deshalb Frage ich! :wiejetzt:
achja Brauche keinem Link zum PHP handbuch des habe ich schon :dp: !

mbamler 14. Mär 2006 07:47

Re: Problem mit Polygon auf Canvas Drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von TiPi
Hallo erstmal :-),

Ich möchte ein selbsterstelltes Polygon in einem Canvas Drehen.

Hier erstmal der Grundquelltext für das Drehen:

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
begin
  winkel:=strtofloat(edit3.Text);     //umrechnen in pi und volle drehung der winkel

   if winkel <= 180 then  hwink:=((winkel/180)*pi)
        else  hwink:=-(((winkel-180)/180)*pi) ;
        swink:=sin(hwink);
         for k:=1 to (n-1) do
          begin
            //x-werte differenz zu letztem n punkt last!!
                  //letzten punkt holen
                 //mit x-werte subtrahieren
          xdel:=xp[n-k]-xp[last];      //delta x wert n-k
          ydel:=yp[n-k]-yp[last];     //delta y wert
           //vorzeichen bestimmen
           if xdel>0 then xvorz:=true else xvorz:=false;
           if ydel>0 then yvorz:=true else yvorz:=false;

                                     //berechnung neuerwert sin bzw,cos
           lange:=sqrt((xdel*xdel)+(ydel*ydel));
          // lange:=round(lange);
           winklast:=(radtodeg(arctan(ydel/xdel)));//winkel von last x-achse zu punkt
           //4.quadrant
           if (xvorz and yvorz)=true then drehw:=winklast - winkel; //4.quadrant

           //3.quadrant
           if xvorz=false then              //3.quadrant
           begin
           if yvorz=true then drehw:=180+winklast - winkel;
           end;

           //2.quadant
           if xvorz=false then                //2.quadrant
           begin
           if yvorz=false then drehw:=180+winklast-winkel;
           end;

           //1.quadrant
           if xvorz=true then
           begin
           if yvorz=false then  drehw:=(winklast-winkel);
           end;

           //drehw:=winklast - winkel;     //winkel nach drehung um winkel zur x durch last
           drehw:=degtorad(drehw);      //drehwinkel x achse in rad
                                         //richtungssinn  der winkel
           xs[1]:=xp[last];
           ys[1]:=yp[last];
           xs1:=(xp[last]+(lange*(cos(drehw))));
           xs[k+1]:=round(xs1);                  //K
           ys1:=(yp[last]-(lange*(-sin(drehw))));
           ys[k+1]:=round(ys1);
           //end;

          //  for a:=1 to h do
           // begin
           // xs[k]:=xs[n-k];
           // ys[k]:=ys[n-k];
           // end;

          //dist:='x '+floattostr(xs[k])+' y '+floattostr(ys[k]);
          //listbox2.items.Add(dist);

            dist:=floattostr(n-k)+' '+'x '+floattostr(xs[k+1])+' y '+floattostr(ys[k+1]);
          listbox2.items.Add(dist);


             // if siny2 >0  then  xs[k]:=xp[n-k]+sinx2  ;
              //s[k]:=yp[n-k]y-siny2 ;

          //if ydel>0   then  ys[k]:=yp[n-k]+siny2
            //      else      ys[k]:=yp[n-k]-siny2; //neue y koordinate
           image1.canvas.pen.color:=clred;
          image1.canvas.rectangle(xs[k+1]-3,ys[k+1]-3,xs[k+1]+3,ys[k+1]+3); //k
          end;
          //zeichnen der gedrheten figur
           for k:=1 to (n-1) do
          begin
           image1.canvas.moveto(xs[k],ys[k]);
           image1.canvas.lineto(xs[k+1],ys[k+1]);
             end;
           image1.canvas.moveto(xs[n],ys[n]);
           image1.canvas.lineto(xs[1],ys[1]);

           // image1.canvas.brush.style:=bsclear;
            image1.canvas.pen.color:=clblack;
end;
Das Drehen um den letzten Punkt habe ich nach vielen Versuchen endlich Hinbekommen das Problem ist aber ich muss des ding um den ersten Punkt drehen :(

Bekomme des aber nach tagelangem versuchen immer noch nicht hin.


Kann mir da jemand helfen mit nem Kleinem Tipp wo und wie ich da jetzt ansetzen sollte.

sollte der rest des Quellcodes noch gebraucht werden bitte sagen! der ist dann nicht mehr so lang :)


Danke für die Hilfe



Wenn ich alles wüßte wäre, ich gott bin ich aber nicht deshalb Frage ich! :wiejetzt:
achja Brauche keinem Link zum PHP handbuch des habe ich schon :dp: !




Was in deinem Code das Problem ist kann ich nicht so schnell analysieren...
Aber vielleicht hilft dir ja der Code weiter, den ich mal vor ein paar Monaten gemacht habe.
Er kommt hier am Hamburger Airport zum Einsatz in einem Programm, dass die Positionen der Flugzeuge auf dem Vorfeld darstellt.

Gruß
Matthias

marabu 14. Mär 2006 08:43

Re: Problem mit Polygon auf Canvas Drehen
 
Herzlich willkommen in der Delphi-PRAXiS, TiPi.

Für dich und andere ist es wichtig, dass du dein Problem in möglichst überschaubarer Form darstellst. Bei einem rein algorithmischen Problem interessiert die Benutzerschnittstelle (Edit3, Button1) niemanden, dafür aber die von dir verwendeten Variablen.

Die Punkte für dein Polygon musst du nicht in zwei Arrays getrennt nach Abszisse und Ordinate speichern:

Delphi-Quellcode:
type
  TPointDynArray = array of TPoint;
var
  polygon: TPointDynArray;
Für das Zeichnen kannst du statt MoveTo() und LineTo() gleich Polygon() verwenden. Rotieren wird von Windows NT ff. direkt unterstützt (SetGraphicsMode, SetWorldTransform). Wenn du um einen bestimmten Punkt rotieren willst, dann musst du diesen Punkt zuerst in den Ursprung verschieben, dann das Polygon rotieren und zuletzt die Verschiebung wieder rückgängig machen. Auch dabei hilft dir Windows (CombineTransform). Natürlich geht das alles auch zu Fuß, aber die Vorgehensweise ist trotzdem die selbe.

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz