/** We calculate the effective area for the first time */ void ptarray_calc_areas(EFFECTIVE_AREAS *ea, int avoid_collaps, int set_area, double trshld) { LWDEBUG(2, "Entered ptarray_calc_areas"); int i; int npoints=ea->inpts->npoints; int is3d = FLAGS_GET_Z(ea->inpts->flags); double area; const double *P1; const double *P2; const double *P3; P1 = (double*)getPoint_internal(ea->inpts, 0); P2 = (double*)getPoint_internal(ea->inpts, 1); /*The first and last point shall always have the maximum effective area. We use float max to not make trouble for bbox*/ ea->initial_arealist[0].area=ea->initial_arealist[npoints-1].area=FLT_MAX; ea->res_arealist[0]=ea->res_arealist[npoints-1]=FLT_MAX; ea->initial_arealist[0].next=1; ea->initial_arealist[0].prev=0; for (i=1;i<(npoints)-1;i++) { ea->initial_arealist[i].next=i+1; ea->initial_arealist[i].prev=i-1; P3 = (double*)getPoint_internal(ea->inpts, i+1); if(is3d) area=triarea3d(P1, P2, P3); else area=triarea2d(P1, P2, P3); LWDEBUGF(4,"Write area %lf to point %d on address %p",area,i,&(ea->initial_arealist[i].area)); ea->initial_arealist[i].area=area; P1=P2; P2=P3; } ea->initial_arealist[npoints-1].next=npoints-1; ea->initial_arealist[npoints-1].prev=npoints-2; for (i=1;i<(npoints)-1;i++) { ea->res_arealist[i]=FLT_MAX; } tune_areas(ea,avoid_collaps,set_area, trshld); return ; }
/** * We calculate the effective area for the first time */ void ptarray_calc_areas( EFFECTIVE_AREAS *ea, int avoid_collaps, int set_area, double trshld ) { //LWDEBUG( 2, "Entered ptarray_calc_areas" ); int i; int npoints = ea->inpts.size(); double area; QgsPointV2 P1; QgsPointV2 P2; QgsPointV2 P3; P1 = ea->inpts.at( 0 ); P2 = ea->inpts.at( 1 ); // The first and last point shall always have the maximum effective area. We use float max to not make trouble for bbox ea->initial_arealist[0].area = ea->initial_arealist[npoints - 1].area = FLT_MAX; ea->res_arealist[0] = ea->res_arealist[npoints - 1] = FLT_MAX; ea->initial_arealist[0].next = 1; ea->initial_arealist[0].prev = 0; for ( i = 1; i < ( npoints ) - 1; i++ ) { ea->initial_arealist[i].next = i + 1; ea->initial_arealist[i].prev = i - 1; P3 = ea->inpts.at( i + 1 ); if ( ea->is3d ) area = triarea3d( P1, P2, P3 ); else area = triarea2d( P1, P2, P3 ); //LWDEBUGF( 4, "Write area %lf to point %d on address %p", area, i, &( ea->initial_arealist[i].area ) ); ea->initial_arealist[i].area = area; P1 = P2; P2 = P3; } ea->initial_arealist[npoints - 1].next = npoints - 1; ea->initial_arealist[npoints - 1].prev = npoints - 2; for ( i = 1; i < ( npoints ) - 1; i++ ) { ea->res_arealist[i] = FLT_MAX; } tune_areas( ea, avoid_collaps, set_area, trshld ); }