[Top][All Lists]
[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);
}
}
- [Gzz-commits] libvob/include/vob/vobs Fillet.hxx,
Janne V. Kujala <=