gzz-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gzz-commits] libvob/include/vob/vobs Fillet.hxx


From: Janne V. Kujala
Subject: [Gzz-commits] libvob/include/vob/vobs Fillet.hxx
Date: Wed, 02 Jul 2003 10:53:02 -0400

CVSROOT:        /cvsroot/libvob
Module name:    libvob
Branch:         
Changes by:     Janne V. Kujala <address@hidden>        03/07/02 10:53:02

Modified files:
        include/vob/vobs: Fillet.hxx 

Log message:
        more triangulation code

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/libvob/libvob/include/vob/vobs/Fillet.hxx.diff?tr1=1.38&tr2=1.39&r1=text&r2=text

Patches:
Index: libvob/include/vob/vobs/Fillet.hxx
diff -u libvob/include/vob/vobs/Fillet.hxx:1.38 
libvob/include/vob/vobs/Fillet.hxx:1.39
--- libvob/include/vob/vobs/Fillet.hxx:1.38     Wed Jul  2 09:23:51 2003
+++ libvob/include/vob/vobs/Fillet.hxx  Wed Jul  2 10:53:02 2003
@@ -39,9 +39,10 @@
 
 #include <vob/glerr.hxx>
 
-#include <vob/geom/Fillets.hxx>
 #include <vob/geom/Fillets2.hxx>
 
+#include <vob/poly/Dicer.hxx>
+
 #ifndef VOB_DEFINED
 #define VOB_DEFINED(t)
 #endif
@@ -749,6 +750,16 @@
        int N;
        float r;
 
+       int append(ZVec v, bool b = false) {
+           int ind = size();
+           if (b)
+               push_back(Vert(v, b));
+           else
+               push_back(f.blend(conns, N, r, v));
+
+           return ind;
+       }
+
        int operator() (int i, int j, float fract = .5) {
            int ind = size();
            push_back(f.blend(conns, N, r,
@@ -781,7 +792,24 @@
     };
 
 
-    
+    void addSpan(std::vector<int> &poly, Verts &verts, int i0, int i1, ZVec 
d0, ZVec d1) const {
+       int i, k0 = i0, k1 = i0;
+       float d0min = 1E20;
+       float d1min = 1E20;
+       for (i = i0; i < i1; i++) {
+           float dist0 = (verts[i] - d0).length();
+           float dist1 = (verts[i] - d1).length();
+           if (dist0 < d0min) d0min = dist0, k0 = i;
+           if (dist1 < d1min) d1min = dist1, k1 = i;
+       }
+
+       i = k0;
+       do {
+           poly.push_back(i);
+           if (++i == i1) i = i0;
+       } while (i != k1);
+       
+    }
 
     void render(const Transform **t, int n) const {
        const Transform &thick_t = *t[0];
@@ -854,6 +882,60 @@
            glVertex(p0 + 3 * r * dirs[tri[i][2]]);
            glEnd();
        }
+
+
+       // Add the vertices of the diced midsections of the connectors
+       Verts verts(*this, conns, N, r);
+       for (i = 0; i < N; i++) {
+           float t = 0.5 * conns[i]->c.t;
+           float d = conns[i]->c.d;
+
+           ZVec e0 = conns[i]->dir;
+           ZVec e1 = e0.crossp(ZVec(0,0,1));
+           ZVec e2 = e0.crossp(e1);
+
+           ZVec p0 = d * e0;
+
+           for (j = 0; j < ndice; j++) {
+               float a = j * M_PI * 2 / ndice;
+               verts.append(p0 + t * (e1 * cos(a) + e2 * sin(a)), true);
+           }
+       }
+
+       // Add the dummy connector vertices
+       int dummy_i0 = verts.size();
+       for (i = N; i < (int)dirs.size(); i++) {
+           verts.append(dirs[i]);
+       }
+
+       // Triangulate the surface
+       ::Vob::Dicer::Triangles<Verts> triangler(verts);
+       for (i = 0; i < (int)tri.size(); i++) {
+           std::vector<int> poly;
+           for (j = 0; j < 3; j++) {
+               int k = tri[i][j];
+               if (k >= N) {
+                   poly.push_back(dummy_i0 + k - N);
+               } else {
+                   int k0 = tri[i][(j+1)%3];
+                   int k1 = tri[i][(j+2)%3];
+                   if ((dirs[k0] - dirs[k]).crossp(dirs[k1] - 
dirs[k]).dot(dirs[k]) < 0)
+                       k0 ^= k1 ^= k0 ^= k1; // Swap
+                       
+                   addSpan(poly, verts, ndice * k, ndice * (k + 1), dirs[k0], 
dirs[k1]);
+               }
+           }
+
+           // Triangulate as a star polygon
+           ZVec sum(0,0,0);
+           for (j = 0; j < (int)poly.size(); j++)
+               sum += verts[poly[j]];
+
+           int nvert = verts.append(sum);
+           for (j = 0; j < (int)poly.size(); j++)
+               triangler.add(nvert, poly[j], poly[(j+1) % poly.size()]);
+       }
+       
 
 
        ZVec pt[ndice + 1][ndice*2];




reply via email to

[Prev in Thread] Current Thread [Next in Thread]