[Top][All Lists]
[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;