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 1 von 2  1 2      
Sinderion

Registriert seit: 23. Nov 2007
Ort: Oberösterreich
19 Beiträge
 
Delphi XE7 Architect
 
#1

AW: Polygon drehen

  Alt 11. Mai 2011, 18:38
Erst die Vektoren relativ zu dem Punkt ausrechnen, um den gedreht werden soll, also z.B:
Code:
P_relativ[i]:=P[i]-P1
Dann mit der Drehmatrix multiplizieren, war glaube ich:

Code:
M = (  Cos(alpha)  Sin(alpha) )
    (  -Sin(Alpha) Cos(Alpha) )
Also:
Code:
P_gedreht = M * P_relativ
So in etwa müsste es funktionieren.
Daniel
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#2

AW: Polygon drehen

  Alt 11. Mai 2011, 21:21
Das stammt aus meiner Sammlung :

Delphi-Quellcode:
RVektor = record
 x, y: Double;
end;
// WZ = Winkel

function Rotate(WZ : Double; Vektor : RVektor): RVektor;
begin
  result.x := Vektor.x * cos(degtorad(WZ)) - Vektor.y * sin(degtorad(WZ));
  result.y := Vektor.x * sin(degtorad(WZ)) + Vektor.y * cos(degtorad(WZ));
end;
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

AW: Polygon drehen

  Alt 11. Mai 2011, 21:54
So in etwa müsste es funktionieren.
Nicht vergessen, die gedrehten vektoren wieder "zurückzuschieben"
  Mit Zitat antworten Zitat
christopher85

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

AW: Polygon drehen

  Alt 30. Jun 2011, 14:12
Hallo! Ich habe die selbe Aufgabe, jedoch ein etwas anderes Problem!
der debugger zeigt mir eine fehlermeldung an: die dateitypen seien inkompatibel. ich soll es wohl als integer deklariert haben. jedoch wird der code in extendet gerechnet.

Zitat:
procedure TForm1.Button4Click(Sender: TObject);
begin
w:=spinedit1.value;
for i:=1 to n do
begin
u:=yp[n]*sin(w)+xp[n]+cos(w);
v:=yp[n]+cos(w)-xp[n]+sin(w);
// und zwar will ich in dem oberen programmstück die koorinaten eines Punktes errechnen. dazu nehme ich den winkel aus einer spinedit.

Zitat:
var u,v,y,x,n,i:integer;
w:extended;
xp,yp:array[1..100]of integer;
// meine variablendeklaration sieht dann ungefähr so aus. dachte mir, da ich W vorher als integer deklariert hatte, mach ich daraus extendet. ich kann mir vorstellen, dass nachkommawerte bei der rechnung mit cosinus und sinus rauskommen. aber wie kann ich das in der variablendeklaration ermöglichen?
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#5

AW: Polygon drehen

  Alt 30. Jun 2011, 14:18
Zitat:
aber wie kann ich das in der variablendeklaration ermöglichen?
Delphi-Quellcode:
var
u,v,y,x,w: double; // oder single / extended / real
n,i:integer; // i ist eine schleifenvariable, also integer. n anscheinend auch. aber wo wird die gesetzt? in deinem code nicht...
xp,yp:array[1..100]of integer; // wenn das auch zahlen mit nachkommastellen sein können, dann auch hier double / single / extended / real...

oder ich versteh nicht, wo nun das problem sein soll?

Edit: Noch was zum Unterschied der Fliesskomma-Typen:

Single
Genauigkeit: 7–8 Nachkommastellen , Speichergrösse: 4 Byte

Double / Real
Genauigkeit: 15–16 Nachkommastellen , Speichergrösse: 8 Byte

Extended
Genauigkeit: 19–20 Nachkommastellen , Speichergrösse: 10 Byte

Geändert von blackfin (30. Jun 2011 um 14:48 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

AW: Polygon drehen

  Alt 30. Jun 2011, 14:59
Siehe auch Code-Library: Verschiebung und Drehung im 2D Raum
Andreas
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Polygon drehen

  Alt 30. Jun 2011, 15:23
Wenn x und y integer sind, ist es folgerichtig, wenn u und v auch integer sind.
x,y,u,v: array [1..100] of integer;
Delphi-Quellcode:
Procedure Transformiere (const x,y: integer; w: double; var u,v: integer);
begin
  w:= w * 3.1416/180;
  u := Round( x * cos (w) + y * sin(w));
  v := Round( -x * sin (w) + y * cos(w));
end;
Delphi-Quellcode:
  for i := 1 to n do
    Transformiere (x[i], y[i], spinedit1.value, u[i], v[i]);

Wenn x und y double sind, ist es folgerichtig, wenn u und v auch double sind.
x,y,u,v: array [1..100] of double;
Delphi-Quellcode:
Procedure Transformiere (const x,y: double; w: double; var u,v: double);
begin
  w:= w * 3.1416/180;
  u := x * cos (w) + y * sin(w);
  v := -x * sin (w) + y * cos(w);
end;
Delphi-Quellcode:
  for i := 1 to n do
    Transformiere (x[i], y[i], spinedit1.value, u[i], v[i]);
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Polygon drehen

  Alt 30. Jun 2011, 16:11
@Bjoerk ich würde die Prozedure nicht "Transformiere" sondern "Rotiere" nennen.
Aber ich möchte doch nochmal auf meinen vorherigen Beitrag verweisen.
Eleganter kann man es eigentlich nicht programmieren.
Das es sich bei Rotate2D und Translate2D um Funktionen handelt, kann man sie problemlos verketten:
Delphi-Quellcode:
// verschieben, drehen um 45 Grad und zurückverschieben
NeuPunkt := Translate2D(Rotate2D(Translate2D(orgPunkt, P2), DegToRad(45.0)), invP2);
Durch die Verwendung des Records TPoint wird der Code leichter lesbar.
Bleibt man bei x und y, braucht man doppelt so viele Variablen.

Man kann aus den Verschiebungen und Drehungen auch eine Transformationsmatrix berechnen.
Dann kann man diese Transformationsmatrix auf alle Punkte anwenden und spart so Rechenzeit. Dafür ist dann die nötige Mathematik etwas aufwändiger.
Andreas

Geändert von shmia (30. Jun 2011 um 16:13 Uhr)
  Mit Zitat antworten Zitat
christopher85

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

AW: Polygon drehen

  Alt 30. Jun 2011, 17:26
Guten Abend!

Also im Anhang habe ich mal einen Screenshot angehängt. In ihm sieht man halt unten in dieser Berichtigungszeile, dass inkompatible Typen auftreten.

Und zwar in den Zeilen vom Code:

Delphi-Quellcode:
w:=spinedit1.value;
for i:=1 to n do
  begin
    u:=yp[n]*sin(w)+xp[n]+cos(w);
    v:=yp[n]+cos(w)-xp[n]+sin(w);
Ich habe dann natürlich erstmal gegoogelt was das bedeutet. Weiss da aber irgendwie nicht weiter.

Das ist aber nur mein Teilproblem. Außerdem weiss ich nicht wie ich die Kooridanten u und v wieder in das array bekommen soll (für alle anderen punkte) und deses dann wieder zeichnen soll. Aber das ist erstmal ein anderer Schuh.

EDIT: also ich muss sagen, dass ich ecuh n bissl bewundere. ich schu mir gerade so die angebotenen quelltexte an und finde es ziemlich kompliziert sich in andere quelltexte reinzufuchsen. auch wegen der unterschiedlich definierten variablen.
Angehängte Grafiken
Dateityp: jpg ansichtbeleg35.jpg (111,2 KB, 14x aufgerufen)

Geändert von christopher85 (30. Jun 2011 um 17:44 Uhr) Grund: kurze anmerkung
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.912 Beiträge
 
Delphi 12 Athens
 
#10

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
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:09 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