Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Rotation im Raum klappt nicht richtig (https://www.delphipraxis.net/145405-rotation-im-raum-klappt-nicht-richtig.html)

Kytrix 31. Dez 2009 04:53


Rotation im Raum klappt nicht richtig
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi mein Würfel den ich erstelle wird nicht richtig gedrecht entsprechend den Achsenangaben....

liegt es daran das ich mir das zeichnen erleichtert habe indem ich einfach die Z-koordinaten weggelassen habe ?

(Es wird immer vom aktuellen stand weiter gedreht)

Kytrix 31. Dez 2009 05:12

Re: Rotation im Raum klappt nicht richtig
 
Liste der Anhänge anzeigen (Anzahl: 1)
die lösung ist mir gerade selber eingefallen ..... ich hatte das koordinatensystem nicht in das zentrum des objekts (würfels) gelget jetz rotiert er richtig .... muss nur noch mal meinen code überarbeten weil mein würfel merkwürdigerweise mit jeder Rotationsausführung kleiner wird :D

turboPASCAL 31. Dez 2009 05:21

Re: Rotation im Raum klappt nicht richtig
 
Es wäre hilfreich wenn du uns sagst wie du den Würfel drehst.

Kytrix 31. Dez 2009 05:33

Re: Rotation im Raum klappt nicht richtig
 
Delphi-Quellcode:
procedure TWürfel.Rotate(Punkt: Integer; Achse: Char; Winkel: Integer);
Var x, y, z: Extended;
begin
  case Achse of
    'x': begin
            x:=GetPunktKoordinate(Punkt,'x');
            y:=GetPunktKoordinate(Punkt,'y');
            z:=GetPunktKoordinate(Punkt,'z');
            //Neue Werte errechnen
            x:=(x*1);
            y:=(x*0)+(y*(cos(DegToRad(Winkel))))-(z*(sin(DegToRad(Winkel))));
            z:=(x*0)+(y*(sin(DegToRad(Winkel))))+(z*(cos(DegToRad(Winkel))));
            //Neue Werte zurückgeben
            PunkteArray[Punkt,1]:=x;
            PunkteArray[Punkt,2]:=y;
            PunkteArray[Punkt,3]:=z;
          end;
    'y': begin
            x:=GetPunktKoordinate(Punkt,'x');
            y:=GetPunktKoordinate(Punkt,'y');
            z:=GetPunktKoordinate(Punkt,'z');
            //Neue Werte errechnen
            x:=(x*cos(DegToRad(Winkel)))+(y*0)+(z*(sin(DegToRad(Winkel))));
            y:=(x*0)+(y*1)+(z*0);
            z:=(-x*sin(DegToRad(Winkel)))+(y*0)+(z*(cos(DegToRad(Winkel))));
            //Neue Werte zurückgeben
            PunkteArray[Punkt,1]:=x;
            PunkteArray[Punkt,2]:=y;
            PunkteArray[Punkt,3]:=z;
          end;
    'z': begin
            x:=GetPunktKoordinate(Punkt,'x');
            y:=GetPunktKoordinate(Punkt,'y');
            z:=GetPunktKoordinate(Punkt,'z');
            //Neue Werte errechnen
            x:=(x*cos(DegToRad(Winkel)))-(y*sin(DegToRad(Winkel)))+(z*0);
            y:=(x*sin(DegToRad(Winkel)))+(y*cos(DegToRad(Winkel)))+(z*0);
            z:=(x*0)+(y*0)+(z*1);
            //Neue Werte zurückgeben
            PunkteArray[Punkt,1]:=x;
            PunkteArray[Punkt,2]:=y;
            PunkteArray[Punkt,3]:=z;
          end;
  end;
end;

turboPASCAL 31. Dez 2009 08:21

Re: Rotation im Raum klappt nicht richtig
 
Beispiel:
Delphi-Quellcode:
y:=(x*0)+(y*1)+(z*0);
:gruebel:

Multiplikation mit Null & Multiplikation mit Eins. Was da wohl so bei herauskommt..
;)


Die Z-Achse sollte man nicht ausser Acht lassen.

Kytrix 31. Dez 2009 15:47

Re: Rotation im Raum klappt nicht richtig
 
danke für den tipp :roll:

das ändert aber nichts an dem problem das mein würfel nach jeder rotationsausführung schrumpft ..... also wenn ich die rotation ausführe schrumpfen meine abstände zwischen den punkten

Nikolas 31. Dez 2009 16:54

Re: Rotation im Raum klappt nicht richtig
 
Ich hab schon lang nicht mehr mit Delphi gearbeitet, aber könnte es sein, dass eine float->integer Konvertierung ein floor ist?
Ich kenn die einzelnen Typen nicht, aber das klingt stark nach einem Rundungseffekt.

BTW: (IMHO)
- Umlaute im Quellcode könnten Probleme machen
- Parameter "Punkt: Integer": Ich fänds besser, wenn das "punkt_ndx" heissen würde, schließlich ist es kein Punkt.
- Reine Geschwindigkeit: Ich geh davon aus, dass du die Funktion dann 8Mal für die einzelnen Eckpunkte aufrufst. Da sin/cos recht teure Funktionen sind, könntest du statt dem Winkel (der eigentlich auch ein float sein sollte) direkt die sin/cos-Werte als Parameter übergeben, und sie dann pro Drehung nur ein Mal ausrechnen.

- "x:=GetPunktKoordinate(Punkt,'x');" ist aber nicht das gleiche wie "x :=PunkteArray[Punkt,1];" oder?

Khabarakh 31. Dez 2009 17:54

Re: Rotation im Raum klappt nicht richtig
 
Nach dem Berechnen von x darfst du natürlich nicht diesen neuen Wert zum Berechnen von y benutzen, du musst den alten speichern.
Außerdem können sich, wie Nikolas schon angedeutet hat, Rundungsfehler schnell aufsummieren. Du solltest den Würfel nicht Stück für Stück weiter drehen, sondern immer wieder in der Ausgangslage beginnen und sofort um den gesamten Winkel drehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 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