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

Aktuelle Zeit: Fr Jul 18, 2025 15:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Polygon füllen
BeitragVerfasst: Mo Sep 17, 2007 16:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich habe folgendendes Szenario.
Eine Vertexliste mit Vertice, die miteinander verbunden, die Kontur einer Form ergeben.
Also über GL_LINES den Rahmen zeichnet.
Nun will ich aber die Form ausfüllen und dazu muss ich eine 2. Liste erstellen, wo ich dann über GL_TRIANGLES die Form füllen kann.
Das zauberwort ist Triangulieren und ich hab auch ein Artikel gefunden http://www-lehre.inf.uos.de/cg2/material/20021218/Tesselation.htm aber entweder ist da ein Fehler drin oder ned genau genug beschrieben( 1.4.1 ).

Kennt jemand ein Algo der Funktioniert(website/pdf) oder hat etwas Code?

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 17, 2007 16:20 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Sind deine Vielecke konvex und planar?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 17, 2007 16:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Bild
Bild
Dies sollte es besser veranschaulichen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 18, 2007 03:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich habe das Problem gelöst und werde noch den Code für die Lösung posten.
Die Lösung ist ein sogenanntes Ear Clipping, welches nur bei Polygonen funktioniert, die keine Löscher haben.
Man kann Polygone mit Löscher auch mit einen Ear Clipping Algo lösen, wenn man ein Punkt des Loches und ein Punkt auf der Convehülle als Kante definiert und somit die Reihenfolge neu berechnet. Mehr dazu findet man dann im Netzt.
Code:
  1.  
  2.       FCalculatedVertice:array of TGLVectori2;
  3.       FTriangleIndices:array of cardinal;
  4. ...
  5. function TKar_OGLShape.isconvex(prev,cur,next:TGLVectori2):boolean;
  6. var
  7.   v1,v2:TGLVectori2;
  8. begin
  9.   result:=false;
  10.   v1[0]:=prev[0]-cur[0];
  11.   v1[1]:=prev[1]-cur[1];
  12.   v2[0]:=next[0]-cur[0];
  13.   v2[1]:=next[1]-cur[1];
  14.   if (v1[0]*v2[1]-v1[1]*v2[0])<=0 then
  15.     result:=true;
  16. end;
  17.  
  18. function TKar_OGLShape.SameSide(p1,p2,v1,v2:TGLVectori2):Boolean;
  19. var
  20.   cp1,cp2:TGLVectori3;
  21.   d1,d2,d3:TGLVectori2;
  22. begin
  23.   d1[0]:=v2[0]-v1[0]; d1[1]:=v2[1]-v1[1];
  24.   d2[0]:=p1[0]-v1[0]; d2[1]:=p1[1]-v1[1];
  25.   d3[0]:=p2[0]-v1[0]; d3[1]:=p2[1]-v1[1];
  26.  
  27.   cp1[2]:=d1[0]*d2[1]-d1[1]*d2[0];
  28.   cp2[2]:=d1[0]*d3[1]-d1[1]*d3[0];
  29.  
  30.   if (cp1[2]*cp2[2])>=0 then
  31.     result:=true
  32.   else
  33.     result:=false;
  34. end;
  35.  
  36. function TKar_OGLShape.PointInPolygon(a,b,c,p1:TGLVectori2):Boolean;
  37. begin
  38.   if SameSide(p1,a,b,c) and SameSide(p1,b,a,c) and SameSide(p1,c,a,b) then
  39.     result:=true
  40.   else
  41.     result:=false;
  42. end;
  43.  
  44. function TKar_OGLShape.isear(p1,p2,p3:cardinal;const list:array of TGLVectori2):Boolean;
  45. var
  46.   i:integer;
  47. begin
  48.   result:=false;
  49.   for i:=0 to high(list) do
  50.     if (i<>p1) and (i<>p2) and (i<>p3) then
  51.       if PointInPolygon(list[p1],list[p2],list[p3],list[i]) then
  52.         exit;
  53.   result:=true;
  54. end;
  55.  
  56. procedure TKar_OGLShape.Tesselieren;
  57. var
  58.   l:array of cardinal;
  59.   prev,next,j,i:cardinal;
  60. begin
  61.   setlength(l,length(FCalculatedVertice));
  62.   for i:=0 to high(FCalculatedVertice) do
  63.     l[i]:=i;
  64.  
  65.   while length(l)>3 do
  66.   begin
  67.     i:=0;
  68.     while i<=high(l) do
  69.     begin
  70.       if i=0 then prev:=high(l) else prev:=i-1;
  71.       if i=high(l) then next:=0 else next:=i+1;
  72.       if isconvex(FCalculatedVertice[l[prev]],FCalculatedVertice[l[i]],FCalculatedVertice[l[next]])
  73.          and isear(prev,i,next,FCalculatedVertice) then
  74.       begin
  75.         //setindices
  76.         setlength(FTriangleIndices,length(FTriangleIndices)+3);
  77.         FTriangleIndices[high(FTriangleIndices)-2]:=l[prev];
  78.         FTriangleIndices[high(FTriangleIndices)-1]:=l[i];
  79.         FTriangleIndices[high(FTriangleIndices)]:=l[next];
  80.         //remove from list
  81.         for j:=i to high(l)-1 do
  82.           l[j]:=l[j+1];
  83.         setlength(l,high(l));
  84.       end;
  85.       inc(i);
  86.     end;
  87.   end;
  88.   //setindices
  89.   setlength(FTriangleIndices,length(FTriangleIndices)+3);
  90.   FTriangleIndices[high(FTriangleIndices)-2]:=l[0];
  91.   FTriangleIndices[high(FTriangleIndices)-1]:=l[1];
  92.   FTriangleIndices[high(FTriangleIndices)]:=l[2];
  93. end;


Ich habe meine neue GUI auf Shapes umgestellt und lasse im ersten Schritt den Rahmen errechnen(quadratische Bezierkurven).
Die neuen Punkte(FCalculatedVertice) werden dann zum Tesselieren übergeben und dann bekomme ich eine Indexliste zurück.
Die Border und Fill Klassen können dann noch auswirkungen auf die Abhandlung, der Zeichenroutine haben.
So kann z.B. Fill Bilder und Gardients(Farbliste wird in eine Textur mit Linearer interpolation gesteckt) oder Border kann die Rundungsstufen und die Größe des Rundungsbereiches festlegen. Keine rundungen sind auch möglich, man muss RoundSteps einfach auf 0 setzten.
So sieht aktuell meine Shape basierte GUI aus.
-TKar_Image mit einer DDS(DXT) Datei
-TKar_Button mit einen Gardient als Füller und zentrierten Text
-2TKar_Panel mit Default Theme Werten
-2TKar_Label mit Text
-TKar_TabPanel(noch beim coden)
Bild

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


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


Wer ist online?

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