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

Aktuelle Zeit: Fr Jul 04, 2025 01:14

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Torusknoten
BeitragVerfasst: Fr Jan 04, 2008 00:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Ich code grade an einer kleinen Demo (immerhin das einfachste, um mal ohne zu großen Aufwand tolle Grafik zu zaubern) und durchstöberte ua. das DGLwiki auf der Suche nach interessanten Effekten, die man einbauen könnte, wodurch ich auf den Artikel Geometrie_durch_Kurven gestoßen bin.

Das klappt aber nicht ganz wie geplant... daher hätte ich einige Fragen:
1. Unter http://en.wikipedia.org/wiki/Torus_knot sieht Phi anders aus, liegt das daran, dass man das so umformen kann oder ist das was total anderes?
2. Die angegebene Funktion berechnet & zeichnet ja einen Torusknoten für ein bestimmtes Intervall... woher weiß ich/berechne ich jetzt aber die Länge eines bestimmten (p,q)-Knotens?
3. Meine Umsetzung hier scheint zwar generell einen Knoten zu zeichnen, aber der sieht nicht ganz so aus, wie er es tun sollte... (siehe Bild im Anhang) vielleicht hat da jemand ne Idee?

Code:
  1. procedure TorusKnot(a, b, r, p, q: Single);
  2.   function Phi(r, p, q, t: Single): TVector3f;
  3.   begin
  4.     Result.X := (2+r*Cos(p*t))*Cos(q*t);
  5.     Result.Y := (2+r*Cos(p*t))*Sin(q*t);
  6.     Result.Z := Sin(p*t);
  7.   end;
  8.   function PhiD(r, p, q, t: Single): TVector3f;
  9.   var
  10.     phia, phib: TVector3f;
  11.   begin
  12.     phia := Phi(r, p, q, t);
  13.     phib := Phi(r, p, q, t+1E-5);
  14.     Result.X := (phib.X-phia.X)/(1E-5);
  15.     Result.Y := (phib.Y-phia.Y)/(1E-5);
  16.     Result.Z := (phib.Z-phia.Z)/(1E-5);
  17.   end;
  18.   function PhiDD(r, p, q, t: Single): TVector3f;
  19.   var
  20.     phia, phib: TVector3f;
  21.   begin
  22.     phia := PhiD(r, p, q, t);
  23.     phib := PhiD(r, p, q, t+1E-5);
  24.     Result.X := (phib.X-phia.X)/(1E-5);
  25.     Result.Y := (phib.Y-phia.Y)/(1E-5);
  26.     Result.Z := (phib.Z-phia.Z)/(1E-5);
  27.   end;
  28. var
  29.   vData, nData: array[0..127] of array[0..7] of TVector3f;
  30.   i, j: Integer;
  31.   Tri: array [0..2] of TVector3f;
  32.   phivec: TVector3f;
  33.   t, u: Single;
  34. begin
  35.   for i := 0 to High(vData) do
  36.   begin
  37.     t := a + (b-a)*(i/High(vData));
  38.     Tri[0] := PhiD(r, p, q, t);
  39.     Normalize(Tri[0]);
  40.     Tri[1] := PhiDD(r, p, q, t);
  41.     Normalize(Tri[1]);
  42.     // cross product
  43.     Tri[2].X := Tri[0].Y*Tri[1].Z - Tri[0].Z*Tri[1].Y;
  44.     Tri[2].Y := Tri[0].Z*Tri[1].X - Tri[0].X*Tri[1].Z;
  45.     Tri[2].Z := Tri[0].X*Tri[1].Y - Tri[0].Y*Tri[1].X;
  46.  
  47.     phivec := Phi(r, p, q, t);
  48.  
  49.     for j := 0 to High(vData[i]) do
  50.     begin
  51.       u := 2*Pi*(j/High(vData[i]));
  52.       nData[i, j].X := Sin(u)*Tri[1].X + Cos(u)*Tri[2].X;
  53.       nData[i, j].Y := Sin(u)*Tri[1].Y + Cos(u)*Tri[2].Y;
  54.       nData[i, j].Z := Sin(u)*Tri[1].Z + Cos(u)*Tri[2].Z;
  55.      
  56.       vData[i, j].X := r*nData[i, j].X + phivec.X;
  57.       vData[i, j].Y := r*nData[i, j].Y + phivec.Y;
  58.       vData[i, j].Z := r*nData[i, j].Z + phivec.Z;
  59.     end;
  60.      
  61.   end;
  62.  
  63.   for i := 0 to High(vData)-1 do
  64.   begin
  65.     glBegin(GL_TRIANGLE_STRIP);
  66.     for j := 0 to High(vData[i]) do
  67.     begin
  68.       glNormal3f(nData[i,j].X, nData[i,j].Y, nData[i,j].Z);
  69.       glVertex3f(vData[i,j].X, vData[i,j].Y, vData[i,j].Z);
  70.  
  71.       glNormal3f(nData[i+1,j].X, nData[i+1,j].Y, nData[i+1,j].Z);
  72.       glVertex3f(vData[i+1,j].X, vData[i+1,j].Y, vData[i+1,j].Z);
  73.     end;
  74.     glEnd;
  75.   end;
  76.    
  77. end;


MfG


Dateianhänge:
Dateikommentar: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
TorusKnot(0, 1, 0.1, 5, 7);

torus1.gif
torus1.gif [ 5.2 KiB | 6856-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Torusknoten
BeitragVerfasst: Fr Jan 04, 2008 09:47 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
WhiteHunter hat geschrieben:
Das klappt aber nicht ganz wie geplant... daher hätte ich einige Fragen:
1. Unter http://en.wikipedia.org/wiki/Torus_knot sieht Phi anders aus, liegt das daran, dass man das so umformen kann oder ist das was total anderes?
2. Die angegebene Funktion berechnet & zeichnet ja einen Torusknoten für ein bestimmtes Intervall... woher weiß ich/berechne ich jetzt aber die Länge eines bestimmten (p,q)-Knotens?
3. Meine Umsetzung hier scheint zwar generell einen Knoten zu zeichnen, aber der sieht nicht ganz so aus, wie er es tun sollte... (siehe Bild im Anhang) vielleicht hat da jemand ne Idee?

1. Ich glaube der Wikipedia-Eintrag ist falsch(ungeschickt?), denn die z komponente hat auch diesen seltsamen q/p faktor im sinus. Das ist aber arg blöd, weil dann muss man erst ausrechnen, wie lang die Kurve sein muss (abhängig von p und q !).
2. Ist bei meinem Knoten mit angegeben. Länge ist 2Pi. Ansonsten muss man halt wissen, wie man die Funktion konstruiert hat, dann kennt man meist auch die gedachte Parameterwahl ;-)
3. Hmm... evtl ist bei deinen Ableitungen was blöd geloffen. Allerdings ist es an sich nicht so wild, sinus und cosinus abzuleiten, warum also numerisch ableiten? Es ist evtl. auch ganz geschickt, dafür zu sorgen, daß die Ableitungen länge 1 haben (meinen code checke... ja wird gemacht. Puh ;) ). Und wenns dann immernochnet klappt fragste nochmal, dann fische ich das Stereo-Projekt nochmal raus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 15:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Hm, irgendwie war ich letzte Nacht wohl total blind...
Nachdem ich jetzt analytisch ableite und festgestellt habe, dass da ja eigentlich 3 Radien vorkommen, tut nun alles wie gewünscht. Danke für die Hilfe ;)

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 15:56 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Wenn Du Spaß an der Sache hast, kannste natürlich auch andere Objekte als Kreise drüberziehen. Lustig wirds, wenn man parametrische Objekte drüberzieht, die sich entlang der Kurve verändern ;-) Ist dann allerdings etwas aufwänder, schaut aber "cool" aus ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 16:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Das ist natürlich ne interessante Idee... an was für eine Art von parametrischen Objekten denkst du dabei?

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 19:12 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Also das einfachste wäre wohl einfach mal den Kreis über das Intervall von Phi hinweg dicker und dünner werden zu lassen. In dem Wikicode also tuberadius durch eine funktion tuberadius(mu) zu ersetzen - wenn sie 2Pi periodisch ist, wär das für den Knoten sicher nicht schlecht. Ausserdem könnte man einen anderen Polygonzug drüberziehen (der Kreis ist ja eigentlich auch nur ein Polygonzug, von silzesegment punkten auf dem kreis) - etwa einen stern oder so. Wenn man die Anzahl der Punkte immer beibehält, kann man auch den Polygonzug mit mu deformieren - nicht nur den tuberadius, sondern evtl wirklich massiver verformen, indem man z.B. mehrere züge vorgibt, die immer gleich viele punkte haben und zwischen denen über mu immer linear interpoliert wird... da fällt einem sicher noch mehr lustiger kram ein - die funktion zum berechnen der normalen muss alt dann entsprechend mit ausgebaut werden.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 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.010s | 17 Queries | GZIP : On ]