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: Mon, 23 Jun 2003 09:44:39 -0400

CVSROOT:        /cvsroot/libvob
Module name:    libvob
Branch:         
Changes by:     Janne V. Kujala <address@hidden>        03/06/23 09:44:39

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

Log message:
        overlapping node kluge

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

Patches:
Index: libvob/include/vob/vobs/Fillet.hxx
diff -u libvob/include/vob/vobs/Fillet.hxx:1.15 
libvob/include/vob/vobs/Fillet.hxx:1.16
--- libvob/include/vob/vobs/Fillet.hxx:1.15     Sat Jun 14 03:53:04 2003
+++ libvob/include/vob/vobs/Fillet.hxx  Mon Jun 23 09:44:39 2003
@@ -288,6 +288,12 @@
        Conn conn1(thick_t, angle_t, t0, t1, 0.5 * (p1 - ctr).length());
        Conn conn2(thick_t, angle_t, t0, t2, 0.5 * (p2 - ctr).length());
 
+       // XXX: interpolate angle to zero ...
+       float frac1 = 2 * d1 / (crad(t0) + crad(t1));
+       float frac2 = 2 * d2 / (crad(t0) + crad(t2));
+       if (frac1 < 1.0) conn1.a *= sin(M_PI_2 * frac1);
+       if (frac2 < 1.0) conn2.a *= sin(M_PI_2 * frac2);
+
        float th1 = conn1.th;
        float th2 = conn2.th;
 
@@ -300,6 +306,9 @@
        LinearConnectionHalf c1(node, a1, d1, th1, -1, lerp(p0.z, p1.z, .5));
        LinearConnectionHalf c2(node, a2, d2, th2, 1, lerp(p0.z, p2.z, .5));
 
+       bool overlap1 = 2 * d1 < (csize + crad(t1)) * cos(conn1.a);
+       bool overlap2 = 2 * d2 < (csize + crad(t2)) * cos(conn2.a);
+
        if(flags & 64) { // Stretched circle
 
            StretchedCircleFillet f1(node, c1, conn1.a);
@@ -339,21 +348,27 @@
                DBG(dbg_vfillets) << "P cleave: "<< w1<<" "<<w2<<" "
                        << ab<<" "<<fract<<" "<<va1<<" "<<va2<<
                            "\n";
-               renderSpan(
-                       makeLerpFilletSpan(
-                           makeFilletBlend(f1, vf2),
-                           f1,
-                           fract), 1
-                       );
-
-               renderSpan(
-                       makeLerpFilletSpan(
-                           makeFilletBlend(f2, vf1),
-                           f2,
-                           fract), -1
-                       );
+               if (overlap1) 
+                   renderSpan(CircularNodeSpan(node, a1-w1, a1+w1), 0);
+               else
+                   renderSpan(
+                              makeLerpFilletSpan(
+                                                 makeFilletBlend(f1, vf2),
+                                                 f1,
+                                                 fract), 1
+                              );
+
+               if (overlap2) 
+                   renderSpan(CircularNodeSpan(node, a2-w2, a2+w2), 0);
+               else
+                   renderSpan(
+                              makeLerpFilletSpan(
+                                                 makeFilletBlend(f2, vf1),
+                                                 f2,
+                                                 fract), -1
+                              );
            } else 
-               renderNormalOrBlend(node, f1, f2);
+               renderNormalOrBlend(node, f1, f2, overlap1, overlap2);
        } else if(flags & 16) { // Ellipses
            // For now, fix angle of attachment to the given angle
            EllipseCircleFillet f1(node, c1, conn1.a);
@@ -452,17 +467,36 @@
 
     }
 
-    template<class F> void renderNormalOrBlend(const CircularNode &node, const 
F &f1, const F &f2) const {
+    template<class F> void renderNormalOrBlend(const CircularNode &node, const 
F &f1, const F &f2, bool overlap1 = false, bool overlap2 = false) const {
+       float a1 = f1.conn.a;
+       float a2 = f2.conn.a;
+       float w1 = normAngle(f1.dirTang.atan() - a1);
+       float w2 = normAngle(a2 - f2.dirTang.atan());
+       
        if(f1.overlaps(f2)) {
-           renderSpan(makeFilletBlend(f1, f2), 1);
-           renderSpan(makeFilletBlend(f2, f1), -1);
+           if (overlap1) 
+               renderSpan(CircularNodeSpan(node, a1-w1, a1+w1), 0);
+           else
+               renderSpan(makeFilletBlend(f1, f2), 1);
+
+           if (overlap2) 
+               renderSpan(CircularNodeSpan(node, a2-w2, a2+w2), 0);
+           else
+               renderSpan(makeFilletBlend(f2, f1), -1);
+           
        } else {
-           renderSpan(f1, 1);
+           if (overlap1) 
+               renderSpan(CircularNodeSpan(node, a1-w1, a1+w1), 0);
+           else
+               renderSpan(f1, 1);
            float ta1 = f1.dirTang.atan();
            float ta2 = f2.dirTang.atan();
            if(ta2 < ta1) ta2 += 2*M_PI;
            renderSpan(CircularNodeSpan(node, ta1, ta2), 1);
-           renderSpan(f2, -1);
+           if (overlap2) 
+               renderSpan(CircularNodeSpan(node, a2-w2, a2+w2), 0);
+           else
+               renderSpan(f2, -1);
        }
     }
 




reply via email to

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