AW: Polygon drehen
Zitat:
Nebenbei hast du aus Versehen i global deklariert, daher die Warnung, Variablen sollten nach Möglichkeit lokal in der Prozedur deklariert werden... Zitat:
http://docwiki.embarcadero.com/VCL/en/System.Extended Deshalb sollte man Single oder Double benutzen. |
AW: Polygon drehen
Super! Dank Dir Jaenicke!
Nun stellt sich mir noch die Frage wie ich u und das dazugehörige v als Koordinaten wieder als Punkt zeichnen kann. xp[u] und yp[v]. Weil ja durch diese for-Schleife u und v innerhalb kurzer Zeit wieder überschrieben werden. Also muss ich ja innerhalb dieser for-Schleife die Punkte schon zeichnen lassen. Also mal für mich so zur Chronologie: //erst die Punktkooridnaten berechnen
Delphi-Quellcode:
//dann vermutlich in die Matrix einfügen
u:=yp[n]*sin(w)+xp[n]+cos(w);
v:=yp[n]+cos(w)-xp[n]+sin(w); u:=xp[n] v:=yp[n] :?: sry. bin da geistig nackig :lol: //dann vielleicht das spiel mit der Polygonverbindung von Anfang an if n=1 then image1.Canvas.MoveTo(x,y) ; image1.Canvas.LineTo(xp[n],yp[n]); EDIT: was mir gerade noch einfällt: ist es nicht doof Nachkommastellen für ein Canvasarray zu verwenden. das nimmt doch sicherlich nur ganzzahlige Werte, oder? |
AW: Polygon drehen
Delphi-Quellcode:
also bis jetzt macht er mir eine drehunng um den koordinatenursprung. aber ich will ja eigentlich um punkt eins drehen. dazu muss man den abstand von punkt eins zur x und y achse von allen anderen punkten subtrahieren. frage mich aber wie ich das in den quelltext bekommen soll.
procedure TForm1.Button4Click(Sender: TObject);
begin w:=spinedit1.value; w:=w*Pi/180; for n:=1 to n-1 do begin u:=trunc((xp[1]-x)*cos(w)+(yp[1]-y)*sin(w)); v:=trunc(-(xp[1]-x)*sin(w)+(yp[1]-y)*cos(w)); image1.Canvas.Pixels[u,v]:=clgreen; image1.Canvas.Pen.Color:=clgreen; image1.Canvas.Ellipse(u-6,v-6,u+6,v+6); |
AW: Polygon drehen
satz des pythagoras wäre möglich.
Distans zweier punkte ist: Distanz = wurzel((|X1 - X2|)^2 + (|Y1 - Y2|)^2) | = Betragszeichen. bedeutet es wird immer der absolute wert genommen(-2 wird zu 2) Da gibts aber noch andere formeln um das umzusetezn, die ich auch glat für performanter halten würde...mir aber gerade nicht einfallen :D EDIT: Betrags striche können weg, wird ja quadriert. |
AW: Polygon drehen
Hi! Also hier mal der Fertige Quelltext zum Programm: dürfte so laufen. man sollte aber bevor man unterschiedliche winkel ausprobiert immer wieder neu zeichnen weil die variablendeklaration sich in "drehen" überschneidet!vor dem freien verwenden für belege immer wieder n stoßgebet zu meinem dank hinterlassen. dank an das delphiforum
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Spin; type TForm1 = class(TForm) Image1: TImage; Label1: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Label2: TLabel; SpinEdit1: TSpinEdit; procedure Button3Click(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation var p,q,u,v,y,x,n,i:integer; xp,yp:array[1..100]of integer; w:extended; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if n>1 then begin image1.Canvas.LineTo(xp[1],yp[1]); end; end; procedure TForm1.Button2Click(Sender: TObject); begin image1.Canvas.brush.Style:=bssolid; image1.Canvas.Pen.Color:=clwhite; image1.Canvas.Rectangle(0,0,image1.Width,image1.Height); image1.Canvas.Pen.Color:=clblack; n:=0 end; procedure TForm1.Button3Click(Sender: TObject); begin close; end; procedure TForm1.Button4Click(Sender: TObject); var i:integer; begin w:=spinedit1.value; w:=w*Pi/180; for n:=1 to n do begin u:=trunc((xp[n]-xp[1])*cos(w)+(yp[n]-yp[1])*sin(w))+xp[1]; v:=trunc(-(xp[n]-xp[1])*sin(w)+(yp[n]-yp[1])*cos(w))+yp[1]; image1.Canvas.Pixels[u,v]:=clgreen; image1.Canvas.Pen.Color:=clgreen; image1.Canvas.Ellipse(u-6,v-6,u+6,v+6); xp[n]:=u; yp[n]:=v; end; image1.Canvas.moveto(xp[1],yp[1]); for i := 2 to n-1 do image1.Canvas.lineto(xp[i],yp[i]); image1.Canvas.lineto(xp[1],yp[1]); end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button=mbleft then begin n:=n+1; xp[n]:=x; yp[n]:=y; image1.Canvas.Rectangle(x-3,y-3,x+3,y+3); if n=1 then image1.Canvas.MoveTo(x,y); end; begin image1.Canvas.LineTo(xp[n],yp[n]); end; if button=mbright then begin image1.canvas.lineto(xp[1],yp[1]); end; end; end. |
AW: Polygon drehen
Nur so als kleiner Tipp:
Wenn du uns das Programm zum Testen / Ansehen zur Verfügung stellen willst, dann ist es meist besser, die Projektdateien ohne die compilierte EXE gezippt an einen Beitrag anzuhängen, anstatt nur den Code der Main-Unit zu posten, denn das Formular müsste man ja so auch noch manuell erstellen :-) |
AW: Polygon drehen
Dein Code in TForm1.Button4Click transformiert den ersten Punkt in den Ursprung. Ist das gewollt oder ein Bug? Wenn nicht, nimm eine for-Schleife die bei 2 startet.Übrigens ist die Konstruktion
Delphi-Quellcode:
mM sehr unschön, warum nimmst Du nicht
for n:=1 to n do
Delphi-Quellcode:
?
for i:=1 to n do
|
AW: Polygon drehen
@gammatester:
Delphi-Quellcode:
Also wenn ich von N zu N gehe machst doch immer genau einen schritt o.O
for N := 1 to N do
|
AW: Polygon drehen
Also das mit dem i=2 ist vermutlich im eifer des Gefechtes da reingerutscht. Mein letztes Problem war das gedrehte Polygon wieder mit linien zu verbinden. Das Programm hat aber immer das letzte ausgelassen. Konnte mir dann kaum noch etwas erklären und hab dann allesmöglich versucht.
Die Projektdateien kann ich leider erst am Monat anhängen, da ich mich jetzt nichtmehr in der Hochschule befinde.sry Edit:(((Das mit dem trunc funktioniert aber dennoch, oder?))) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 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