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

Aktuelle Zeit: Fr Jul 18, 2025 11:17

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 11, 2009 07:47 
Offline
DGL Member

Registriert: Mo Jun 30, 2008 12:47
Beiträge: 69
Hab heute beim Nachgrübeln der Wiki das Fehlen des Toruses bei "Wiki-Techniken und Algorithmen-2.3.1 Geometrie Objekte" entdeckt.

Hier mein Vorschlagscode:

MainFunctions:
-CreateTorus
-RenderTorus

Code:
  1.  
  2. //Auszüge aus uVector ..
  3. const
  4.   toRad: Single = 0.0174532925199433; // = PI / 180
  5.   vecX = 0;
  6.   vecY = 1;
  7.   vecZ = 2;
  8.  
  9. type
  10.   PVector3F = ^TVector3F;
  11.   TVector3F = Array[0..2] of Single;
  12.  
  13.   TTorus = Array of Array of TVector3F;
  14.  
  15. function Vec3F( const X, Y, Z: Single ): TVector3F;
  16. begin
  17.   Result[vecX] := X;
  18.   Result[vecY] := Y;
  19.   Result[vecZ] := Z;
  20. end;
  21.  
  22. function NormalizeVec3F( const A: PVector3F ): TVector3F;
  23. var
  24.   d: Single;
  25. begin
  26.   d := SQRT( A^[vecX] * A^[vecX] + A^[vecY] * A^[vecY] + A^[vecZ] * A^[vecZ] );
  27.   if d > 0 then
  28.     Result := Vec3F( A^[vecX]/d, A^[vecY]/d, A^[vecZ]/d );
  29. end;
  30.  
  31. function SubVec3F( const A, B: PVector3F ): TVector3F;
  32. begin
  33.   Result := Vec3F( A^[vecX] - B^[vecX], A^[vecY] - B^[vecY], A^[vecZ] - B^[vecZ] );
  34. end;
  35.  
  36. function CrossProduct3F( const A, B: PVector3F ): TVector3F;
  37. begin
  38.   Result := Vec3F(
  39.     A^[vecY]*B^[vecZ] - A^[vecZ]*B^[vecY],
  40.     A^[vecZ]*B^[vecX] - A^[vecX]*B^[vecZ],
  41.     A^[vecX]*B^[vecY] - A^[vecY]*B^[vecX]
  42.   );
  43. end;
  44.  
  45. // HERE IT IS :D
  46. function CreateTorus( const MainCircleEdges, SecCircleEdges: Word;
  47.   const MainCircleRadius, SecCircleRadius: Single): TTorus;
  48. var
  49.   Main, Sec: TVector3F;
  50.   mTheta, sTheta: Single;
  51.   i, j: Integer;
  52. begin
  53.   SetLength( Result, MainCircleEdges, SecCircleEdges );
  54.   mTheta := 360/(MainCircleEdges);
  55.   sTheta := 360/(SecCircleEdges);
  56.   for i := 0 to MainCircleEdges-1 do
  57.     for j := 0 to SecCircleEdges-1 do
  58.       Result[i,j] := vec3F(
  59.         (MainCircleRadius+SecCircleRadius*Cos((sTheta*j)*toRad))*cos((mTheta*i)*toRad),
  60.         (MainCircleRadius+SecCircleRadius*Cos((sTheta*j)*toRad))*sin((mTheta*i)*toRad),
  61.         SecCircleRadius*sin((sTheta*j)*toRad) );
  62. end;
  63.  
  64. procedure RenderTorus( const Torus: TTorus );
  65. var
  66.   iH, jH: Integer;
  67.   i, j: Integer;
  68.   vec1, vec2,
  69.   vec3, norm,
  70.   tmp1, tmp2: TVector3F;
  71.   procedure Draw();
  72.   begin
  73.     tmp1 := SubVec3F( @Vec2, @Vec1 );
  74.     tmp2 := SubVec3F( @Vec3, @Vec1 );
  75.     norm := CrossProduct3F( @tmp1, @tmp2 );
  76.     norm := NormalizeVec3F( @norm );
  77.     glNormal3FV( @norm );
  78.     glVertex3FV( @vec1 );
  79.     glVertex3FV( @vec2 );
  80.     glVertex3FV( @vec3 );
  81.   end;
  82. begin
  83.   iH := High(Torus)+1;
  84.   jH := High(Torus[0])+1;
  85.   glBegin( gl_Triangles );
  86.     for i := 0 to iH-1 do
  87.       for j := 0 to jH-1 do
  88.       begin
  89.         vec1 := vec3F( Torus[i,j,vecX], Torus[i,j,vecY], Torus[i,j,vecZ] );
  90.         vec2 := vec3F( Torus[(i+1) mod iH,j,vecX], Torus[(i+1) mod iH,j,vecY], Torus[(i+1) mod iH,j,vecZ] );
  91.         vec3 := vec3F( Torus[(i+1) mod iH,(j+1) mod jH,vecX], Torus[(i+1) mod iH,(j+1) mod jH,vecY], Torus[(i+1) mod iH,(j+1) mod jH,vecZ] );
  92.         Draw();
  93.         vec2 := vec3;
  94.         vec3 := vec3F( Torus[i,(j+1) mod jH,vecX], Torus[i,(j+1) mod jH,vecY], Torus[i,(j+1) mod jH,vecZ] );
  95.         Draw();
  96.       end;
  97.   glEnd();
  98. end;
  99.  


Edit:
Zu CreateTorus:
const MainCircleEdges = Anzahl der Ecken vom großen Kreis
const SecCircleEdges = Anzahl der Ecken vom kleinen Kreis;
const MainCircleRadius = Raidus vom großen Kreis
const SecCircleRadius = Radius vom kleinen Kreis


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
...GOD is wearing black...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 11, 2009 09:04 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Sind bereits enthalten, siehe Geometrie_durch_Kurven, man merkts nur nicht sofort, daß sie da sind :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 11, 2009 14:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was soll das heißen? Sind die nicht verlinkt? Wenn nicht, dann bitte nachholen. Vielleicht auch mit sprechenderem Namen. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

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