AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit Polygon auf Canvas Drehen
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Polygon auf Canvas Drehen

Ein Thema von TiPi · begonnen am 14. Mär 2006 · letzter Beitrag vom 14. Mär 2006
Antwort Antwort
TiPi

Registriert seit: 14. Mär 2006
1 Beiträge
 
#1

Problem mit Polygon auf Canvas Drehen

  Alt 14. Mär 2006, 00:25
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!
achja Brauche keinem Link zum PHP handbuch des habe ich schon !
  Mit Zitat antworten Zitat
mbamler

Registriert seit: 19. Mai 2005
Ort: Hamburg
118 Beiträge
 
Delphi 7 Architect
 
#2

Re: Problem mit Polygon auf Canvas Drehen

  Alt 14. Mär 2006, 08:47
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!
achja Brauche keinem Link zum PHP handbuch des habe ich schon !



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
Angehängte Dateien
Dateityp: zip vector_flugzeug_173.zip (216,4 KB, 31x aufgerufen)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Problem mit Polygon auf Canvas Drehen

  Alt 14. Mär 2006, 09:43
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 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