41 #include "glimports.h"
46 #include "bezierarc.h"
48 #include "simplemath.h"
53 const int Arc::bezier_tag = (1<<13);
54 const int Arc::arc_tag = (1<<3);
55 const int Arc::tail_tag = (1<<6);
63 Arc::makeSide(
PwlArc *pwl, arc_side side )
66 assert( pwlArc == 0 );
67 assert( pwl->npts > 0 );
68 assert( pwl->pts != 0);
86 npts += jarc->pwlArc->npts;
88 }
while( jarc !=
this );
98 Arc::markverts(
void )
104 for(
int i=0; i<jarc->pwlArc->npts; i++ )
105 p[i].nuid = jarc->nuid;
107 }
while( jarc !=
this );
116 Arc::getextrema( Arc_ptr extrema[4] )
118 REAL leftpt, botpt, rightpt, toppt;
120 extrema[0] = extrema[1] = extrema[2] = extrema[3] =
this;
122 leftpt = rightpt = this->tail()[0];
123 botpt = toppt = this->tail()[1];
125 for( Arc_ptr jarc = this->next; jarc !=
this; jarc = jarc->next ) {
126 if ( jarc->tail()[0] < leftpt ||
127 (jarc->tail()[0] <= leftpt && jarc->rhead()[0]<=leftpt)) {
128 leftpt = jarc->pwlArc->pts->param[0];
131 if ( jarc->tail()[0] > rightpt ||
132 (jarc->tail()[0] >= rightpt && jarc->rhead()[0] >= rightpt)) {
133 rightpt = jarc->pwlArc->pts->param[0];
136 if ( jarc->tail()[1] < botpt ||
137 (jarc->tail()[1] <= botpt && jarc->rhead()[1] <= botpt )) {
138 botpt = jarc->pwlArc->pts->param[1];
141 if ( jarc->tail()[1] > toppt ||
142 (jarc->tail()[1] >= toppt && jarc->rhead()[1] >= toppt)) {
143 toppt = jarc->pwlArc->pts->param[1];
159 _glu_dprintf(
"\tPWLARC NP: %d FL: 1\n", pwlArc->npts );
160 for(
int i = 0; i < pwlArc->npts; i++ ) {
161 _glu_dprintf(
"\t\tVERTEX %f %f\n", pwlArc->pts[i].param[0],
162 pwlArc->pts[i].param[1] );
178 _glu_dprintf(
"BGNTRIM\n" );
183 }
while (jarc !=
this);
185 _glu_dprintf(
"ENDTRIM\n" );
195 Arc::isDisconnected(
void )
197 if( pwlArc == 0 )
return 0;
198 if( prev->pwlArc == 0 )
return 0;
201 REAL *p1 = prev->rhead();
203 if( ((p0[0] - p1[0]) > ZERO) || ((p1[0] - p0[0]) > ZERO) ||
204 ((p0[1] - p1[1]) > ZERO) || ((p1[1] - p0[1]) > ZERO) ) {
206 _glu_dprintf(
"x coord = %f %f %f\n", p0[0], p1[0], p0[0] - p1[0] );
207 _glu_dprintf(
"y coord = %f %f %f\n", p0[1], p1[1], p0[1] - p1[1] );
212 p0[0] = p1[0] = (p1[0] + p0[0]) * 0.5;
213 p0[1] = p1[1] = (p1[1] + p0[1]) * 0.5;
224 neq_vert( REAL *v1, REAL *v2 )
226 return ((v1[0] != v2[0]) || (v1[1] != v2[1] )) ? 1 : 0;
240 if(
this == 0 )
return 1;
243 assert( (jarc->pwlArc != 0) || (jarc->bezierArc != 0) );
245 if (jarc->prev == 0 || jarc->next == 0) {
247 _glu_dprintf(
"checkjarc:null next/prev pointer\n");
253 if (jarc->next->prev != jarc) {
255 _glu_dprintf(
"checkjarc: pointer linkage screwed up\n");
263 assert( jarc->pwlArc->npts >= 1 );
264 assert( jarc->pwlArc->npts < 100000 );
271 if( jarc->prev->pwlArc ) {
272 if( jarc->tail()[1] != jarc->prev->rhead()[1] ) {
274 _glu_dprintf(
"checkjarc: geometric linkage screwed up 1\n");
280 if( jarc->tail()[0] != jarc->prev->rhead()[0] ) {
283 _glu_dprintf(
"checkjarc: geometric linkage screwed up 2\n");
290 if( jarc->next->pwlArc ) {
291 if( jarc->next->tail()[0] != jarc->rhead()[0] ) {
293 _glu_dprintf(
"checkjarc: geometric linkage screwed up 3\n");
299 if( jarc->next->tail()[1] != jarc->rhead()[1] ) {
301 _glu_dprintf(
"checkjarc: geometric linkage screwed up 4\n");
308 if( jarc->isbezier() ) {
309 assert( jarc->pwlArc->npts == 2 );
310 assert( (jarc->pwlArc->pts[0].param[0] == \
311 jarc->pwlArc->pts[1].param[0]) ||\
312 (jarc->pwlArc->pts[0].param[1] == \
313 jarc->pwlArc->pts[1].param[1]) );
317 }
while (jarc !=
this);
324 inline long tooclose( REAL x, REAL y )
326 return (glu_abs(x-y) < TOL) ? 1 : 0;
336 Arc::append( Arc_ptr jarc )
341 next->prev = prev->next =
this;