![]() |
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:
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 :(
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; 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: ! |
Re: Problem mit Polygon auf Canvas Drehen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 |
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:
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.
type
TPointDynArray = array of TPoint; var polygon: TPointDynArray; Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 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