Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 08:46

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Punkte einer Linie berechnen
BeitragVerfasst: Fr Jan 20, 2012 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hallo allerseits,
Ich hab eine Problem mit Winkel im 3Dimensionalen Raum. Ich habe eine Ausgangslinie von Punkt A zu Punkt B und somit auch den Vektor von A nach B. An Punkt B soll nun eine weitere Linie angesetzt werden. Ich will mit den folgenden Eingabewerten die neue Position berechnen:

Rotation um die eigene Achse: (Dieser Winkel ist egal, wenn der Abbruch Winkel 0 ist).
Bild

Abbruch Winkel:
Bild

Länge der Linie.

Daraus will ich die neuen Koordinaten berechnen.
Bisher habe ich einfach beim Render, die dazugehörigen Translations und Rotations aufgerufen, da ich jetzt aber für eine Projekterweiterung, die absoluten Koordinaten brauche, will ich es auch so optimieren, dass bereits beim erstellen der Punkte die neuen Koordinaten gespeichert werden.

(Bisherige Lösung):
Code:
  1. type TTurtlePoint = record // Diese records werde als Elemente in einer Liste der Turtle gespeichert.
  2.   Rotation, Angle, Hypotenuse: single;
  3.   Color: TMeleeColor;
  4.   Draw: boolean;
  5.   end;
  6.  
  7. procedure TTurtle.RenderSelf();
  8. var i: integer; ThePoint: ^TTurtlePoint;
  9. begin
  10. for i:= 1 To Points.Count - 1 do // Alle Punkte durchgehen
  11.   begin
  12.   ThePoint := Points.Items[i]; // Informationen einlesen
  13.   glRotatef(ThePoint.Rotation,0,1,0); // Matrix um sich selbst rotieren lassen
  14.   glRotatef(ThePoint.Angle,1,0,0); // Matrix um den Winkel drehen
  15.   glColor4f(ThePoint.Color[0],ThePoint.Color[1],ThePoint.Color[2],ThePoint.Color[3]); // Farbbestimmung
  16.   if ThePoint.Draw then // Wenn gemalt werden soll
  17.     begin
  18.     glBegin(GL_Lines);
  19.       glVertex3f(0,0,0);
  20.       glVertex3f(0,ThePoint.Hypotenuse,0);
  21.     glEnd;
  22.     end;
  23.   glTranslatef(0,ThePoint.Hypotenuse,0); // Die Matrix verschieben, damit die nächste Linie am Ende dieser Linie beginnt.
  24.   end;
  25. end;


Ich wäre euch sehr dankbar, wenn ich mir bei der Umrechnung helfen könntet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Punkte einer Linie berechnen
BeitragVerfasst: Fr Jan 20, 2012 18:18 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Zum Rotieren eines Vektors um eine beliebige Achse kannst du folgende Funktion verwenden:
Code:
  1. function Vectorf3Rotate(v,a:TGLVectorf3;w:GLFloat):TGLVectorf3;
  2. var omc,snw,cnw:GLFloat;
  3. begin
  4.     omc:=1.0-cos(w);
  5.     snw:=sin(w);
  6.     cnw:=cos(w);
  7.     a:=Vectorf3Normalize(a);
  8.     Result[0]:=V[0]*(cnw+A[0]*A[0]*omc)         +   V[1]*(A[0]*A[1]*omc-A[2]*snw)   +   V[2]*(A[0]*A[2]*omc+A[1]*snw);
  9.     Result[1]:=V[0]*(A[1]*A[0]*omc+A[2]*snw)    +   V[1]*(cnw+A[1]*A[1]*omc)        +   V[2]*(A[1]*A[2]*omc-A[0]*snw);
  10.     Result[2]:=V[0]*(A[2]*A[0]*omc-A[1]*snw)    +   V[1]*(A[2]*A[1]*omc+A[0]*snw)   +   V[2]*(cnw+A[2]*A[2]*omc);
  11. end;
  12.  

Also der Parameter v ist der Ausgangsvektor, a die Achse und w der Winkel. Die Funktion kann man sich auch aus der Rotationsmatrix ableiten. Das Problem ist bloß das sich bei einem glRotate das Koordinatensystem bewegt, sodass beim zweiten mal die Achse eigentlich auch gedreht ist. Wenn man die Funktion benutzt, müsste man die Achse für die zweite Rotation auch wie den Vektor beim ersten mal rotieren. Denke ich zumindest.

Die zweite Möglichkeit wäre das man richtig mit Matrizen arbeitet und das von OpenGL nachbildet. Wenn man extrem faul ist, kann man auch die Matrizen mit den OpenGL-Funktionen berechnen und sich dann die Werte mit glGet holen. Dann kannst du Anfangs und Endpunkt mit der Matrix transformieren und hast die neue Linie.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.019s | 17 Queries | GZIP : On ]