gzz-commits
[Top][All Lists]
Advanced

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

[Gzz-commits] libvob/lava/blob dfillets.mp


From: Tuomas J. Lukka
Subject: [Gzz-commits] libvob/lava/blob dfillets.mp
Date: Mon, 26 May 2003 15:03:43 -0400

CVSROOT:        /cvsroot/libvob
Module name:    libvob
Changes by:     Tuomas J. Lukka <address@hidden>        03/05/26 15:03:43

Modified files:
        lava/blob      : dfillets.mp 

Log message:
        First reasonable algorithm

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/libvob/libvob/lava/blob/dfillets.mp.diff?tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: libvob/lava/blob/dfillets.mp
diff -u libvob/lava/blob/dfillets.mp:1.1 libvob/lava/blob/dfillets.mp:1.2
--- libvob/lava/blob/dfillets.mp:1.1    Mon May 26 12:09:21 2003
+++ libvob/lava/blob/dfillets.mp        Mon May 26 15:03:43 2003
@@ -23,6 +23,7 @@
                shifted into.c)
                cutbefore ((0,0) -- into.c))
                ;
+    into.eang := angle(into.c);
 enddef;
 
 def declfcircle(suffix s) =
@@ -33,31 +34,25 @@
 vardef inters(expr p)(suffix s) =
     save i;
     pair i;
-    i := p intersectiontimes s[0].pth;
+    i := p intersectiontimes s.pth;
     if xpart(i) >= 0:
-       point ypart(i) of s[0].pth 
+       point ypart(i) of s.pth 
     else:
-       i := p intersectiontimes s[1].pth;
-       if xpart(i) >= 0:
-           point ypart(i) of s[1].pth 
-       else:
-           (0,0)
-       fi
+       (0,0)
     fi
 enddef;
 
-vardef interppnt(expr ang, r) =
+vardef interppnt(expr ang, bang, bfact, r)(suffix a, b) =
     save d, pd, ia, ib, fa, fb, fc;
     pair d;
-    show ang, "FOO";
     d := dir(ang);
-    path pd;
+    path pd, pb;
     pd = (0,0) -- 10 * r * d;
+    pb = (0,0) -- 10 * r * dir(bang);
 
     pair ia, ib;
     ia = inters(pd , a);
-    ib = inters(pd , b);
-    show ia, ib;
+    ib = inters(pb , b);
     numeric fa, fb;
     fa = abs(ia) - r;
     fb = abs(ib) - r;
@@ -65,7 +60,9 @@
     if fb < 0: fb := 0; fi
 
     numeric fc;
-    fc = fa + fb + r;
+    show fa, fb, bfact;
+    fc := fa + bfact * fb + r;
+    show fc,d,"C";
     d * fc
 
 %    if abs(ia) > abs(ib):
@@ -75,6 +72,42 @@
 %    fi
 enddef;
 
+vardef interpdraw(expr r)(expr aa)(suffix a)(expr ab)(suffix b) =
+    save pa;
+    if aa > ab: errmessage("Dir"); fi
+
+    save interse;
+    pair interse;
+    interse := a.pth intersectionpoint b.pth;
+    
+
+    path pa;
+    numeric fact;
+    if a.eang > ab:
+       show ab, aa, a.eang,"X";
+       fact := (ab - aa) / (a.eang - aa);
+       fact := fact * fact * fact;
+       show fact,"Y";
+
+       save eange;
+       numeric eange;
+       eange := fact[a.eang, angle(interse)];
+
+       pa := 
+       for ang = aa+1 step .1 until eange:
+           interppnt(ang, ang - (a.eang - ab), fact, r, a, b) --
+       endfor
+           interppnt(eange, eange - (a.eang - ab), fact, r, a, b);
+    else:
+       pa := 
+       for ang = aa+1 step .1 until angle(interse):
+           interppnt(ang, ang, 1, r, a, b) --
+       endfor
+           interppnt(angle(interse), angle(interse), 1, r, a, b);
+    fi
+    draw pa withpen pencircle scaled 3pt; 
+enddef;
+
 def diag(expr r, aa, ra, ta,  ab, rb, tb) =
     
     save a, b;
@@ -88,19 +121,19 @@
     draw circle scaled r;
 
 %    draw circle scaled a0.radius shifted a0.c;
+
     draw a0.pth withpen pencircle scaled 1.5pt;
+
     draw a1.pth ;
     draw b0.pth ;
+
     draw b1.pth withpen pencircle scaled 1.5pt;
 %    draw circle scaled a1.radius shifted a1.c;
 %    draw circle scaled b0.radius shifted b0.c;
 %    draw circle scaled b1.radius shifted b1.c;
 
-    draw interppnt(aa+.8, r)
-    for ang = aa+1 step .1 until ab - 1.1:
-       -- interppnt(ang, r)
-    endfor
-       withpen pencircle scaled 3pt;
+    interpdraw(r, aa, a0, ab, b1);
+%    currentpicture := currentpicture yscaled -1;
 
     % Blending curve: 
 
@@ -109,7 +142,10 @@
 enddef;
 
 beginfig(1);
-    diag(100, 90, 200, 5, 120, 150, 6);
+    for an = 100 step 8 until 155:
+       diag(100, 90, 200, 7, an, 150, 10);
+       currentpicture := currentpicture shifted (-200, 0);
+    endfor;
 endfig;
 
 end;




reply via email to

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