44 return VertLeq( u, v );
61 assert( VertLeq( u, v ) && VertLeq( v, w ));
66 if( gapL + gapR > 0 ) {
68 return (v->t - u->t) + (u->t - w->t) * (gapL / (gapL + gapR));
70 return (v->t - w->t) + (w->t - u->t) * (gapR / (gapL + gapR));
85 assert( VertLeq( u, v ) && VertLeq( v, w ));
90 if( gapL + gapR > 0 ) {
91 return (v->t - w->t) * gapL + (v->t - u->t) * gapR;
116 assert( TransLeq( u, v ) && TransLeq( v, w ));
121 if( gapL + gapR > 0 ) {
123 return (v->s - u->s) + (u->s - w->s) * (gapL / (gapL + gapR));
125 return (v->s - w->s) + (w->s - u->s) * (gapR / (gapL + gapR));
140 assert( TransLeq( u, v ) && TransLeq( v, w ));
145 if( gapL + gapR > 0 ) {
146 return (v->s - w->s) * gapL + (v->s - u->s) * gapR;
161 return (u->s*(v->t - w->t) + v->s*(w->t - u->t) + w->s*(u->t - v->t)) >= 0;
172 #define RealInterpolate(a,x,b,y) \
173 (a = (a < 0) ? 0 : a, b = (b < 0) ? 0 : b, \
174 ((a <= b) ? ((b == 0) ? ((x+y) / 2) \
175 : (x + (y-x) * (a/(a+b)))) \
176 : (y + (x-y) * (b/(a+b)))))
178 #ifndef FOR_TRITE_TEST_PROGRAM
179 #define Interpolate(a,x,b,y) RealInterpolate(a,x,b,y)
186 extern int RandomInterpolate;
188 GLdouble Interpolate( GLdouble a, GLdouble x, GLdouble b, GLdouble y)
190 printf(
"*********************%d\n",RandomInterpolate);
191 if( RandomInterpolate ) {
192 a = 1.2 * drand48() - 0.1;
193 a = (a < 0) ? 0 : ((a > 1) ? 1 : a);
196 return RealInterpolate(a,x,b,y);
201 #define Swap(a,b) if (1) { GLUvertex *t = a; a = b; b = t; } else
221 if( ! VertLeq( o1, d1 )) { Swap( o1, d1 ); }
222 if( ! VertLeq( o2, d2 )) { Swap( o2, d2 ); }
223 if( ! VertLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); }
225 if( ! VertLeq( o2, d1 )) {
227 v->s = (o2->s + d1->s) / 2;
228 }
else if( VertLeq( d1, d2 )) {
230 z1 = EdgeEval( o1, o2, d1 );
231 z2 = EdgeEval( o2, d1, d2 );
232 if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
233 v->s = Interpolate( z1, o2->s, z2, d1->s );
236 z1 = EdgeSign( o1, o2, d1 );
237 z2 = -EdgeSign( o1, d2, d1 );
238 if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
239 v->s = Interpolate( z1, o2->s, z2, d2->s );
244 if( ! TransLeq( o1, d1 )) { Swap( o1, d1 ); }
245 if( ! TransLeq( o2, d2 )) { Swap( o2, d2 ); }
246 if( ! TransLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); }
248 if( ! TransLeq( o2, d1 )) {
250 v->t = (o2->t + d1->t) / 2;
251 }
else if( TransLeq( d1, d2 )) {
253 z1 = TransEval( o1, o2, d1 );
254 z2 = TransEval( o2, d1, d2 );
255 if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
256 v->t = Interpolate( z1, o2->t, z2, d1->t );
259 z1 = TransSign( o1, o2, d1 );
260 z2 = -TransSign( o1, d2, d1 );
261 if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
262 v->t = Interpolate( z1, o2->t, z2, d2->t );