AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Polygon drehen

Ein Thema von Peach · begonnen am 11. Mai 2011 · letzter Beitrag vom 1. Jul 2011
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.350 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Polygon drehen

  Alt 30. Jun 2011, 17:35
In ihm sieht man halt unten in dieser Berichtigungszeile, dass inkompatible Typen auftreten.
Weil dein u und v Integervariablen sind, bei der Berechnung aber keine ganzen Zahlen herauskommen. Also deklariere die als Single oder Double oder du musst mit Round runden.

Nebenbei hast du aus Versehen i global deklariert, daher die Warnung, Variablen sollten nach Möglichkeit lokal in der Prozedur deklariert werden...

Extended
Genauigkeit: 19–20 Nachkommastellen , Speichergrösse: 10 Byte
Wobei man Extended nicht mehr benutzen sollte. Die Berechnungen sind damit relativ aufwendig, da diese ohne Coprozessor mit der Prozessorarchitektur nicht abgebildet werden können. Zudem ist man damit auf eine Plattform festgelegt, wie auch im Wiki schon steht:
http://docwiki.embarcadero.com/VCL/en/System.Extended

Deshalb sollte man Single oder Double benutzen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
christopher85

Registriert seit: 30. Jun 2011
6 Beiträge
 
#12

AW: Polygon drehen

  Alt 30. Jun 2011, 18:31
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:
u:=yp[n]*sin(w)+xp[n]+cos(w);
    v:=yp[n]+cos(w)-xp[n]+sin(w);
//dann vermutlich in die Matrix einfügen
u:=xp[n] v:=yp[n] sry. bin da geistig nackig
//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?

Geändert von christopher85 (30. Jun 2011 um 22:10 Uhr)
  Mit Zitat antworten Zitat
christopher85

Registriert seit: 30. Jun 2011
6 Beiträge
 
#13

AW: Polygon drehen

  Alt 1. Jul 2011, 08:59
Delphi-Quellcode:
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);
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.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#14

AW: Polygon drehen

  Alt 1. Jul 2011, 09:59
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

EDIT: Betrags striche können weg, wird ja quadriert.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
christopher85

Registriert seit: 30. Jun 2011
6 Beiträge
 
#15

AW: Polygon drehen

  Alt 1. Jul 2011, 10:54
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.
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#16

AW: Polygon drehen

  Alt 1. Jul 2011, 11:26
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
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#17

AW: Polygon drehen

  Alt 1. Jul 2011, 11:39
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 for n:=1 to n do mM sehr unschön, warum nimmst Du nicht for i:=1 to n do ?

Geändert von gammatester ( 1. Jul 2011 um 12:04 Uhr) Grund: Habe meinen Unsinn ausgeweißt
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#18

AW: Polygon drehen

  Alt 1. Jul 2011, 14:50
@gammatester:

for N := 1 to N do Also wenn ich von N zu N gehe machst doch immer genau einen schritt o.O
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
christopher85

Registriert seit: 30. Jun 2011
6 Beiträge
 
#19

AW: Polygon drehen

  Alt 1. Jul 2011, 16:32
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?)))

Geändert von christopher85 ( 1. Jul 2011 um 16:32 Uhr) Grund: Signaturverwechslung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 11:45 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