28 #pragma optimize("",off)
112 plexit(
"alloc_line: Insufficient memory" );
118 if ( ( line->
x == NULL ) || ( line->
y == NULL ) )
120 plexit(
"alloc_line: Insufficient memory" );
136 plexit(
"alloc_level: Insufficient memory" );
148 if ( ( ( line->
x = (
PLFLT *) realloc( line->
x,
150 ( ( line->
y = (
PLFLT *) realloc( line->
y,
152 plexit(
"realloc_line: Insufficient memory" );
162 if ( startlev == NULL )
170 currlev = currlev->
next;
172 currline = currlev->
line;
188 cline = clevel->
line;
191 #ifdef CONT_PLOT_DEBUG // for 2D plots. For 3D plots look at plot3.c:plotsh3di()
193 for ( j = 1; j < cline->
npts; j++ )
202 while ( cline != NULL );
207 while ( clevel != NULL );
222 currline->
x[pts] = xx;
223 currline->
y[pts] = yy;
235 if ( currline->
npts != 0 )
238 currline = currline->
next;
268 PLFLT delta_x, delta_y;
269 PLINT currx_old, curry_old;
274 currx_old = plsc->currx;
275 curry_old = plsc->curry;
277 *distance += sqrt( delta_x * delta_x + delta_y * delta_y );
283 PLFLT scale, vec_x, vec_y, mx, my, dev_x, dev_y, off_x, off_y;
295 mx = (double) plsc->wpxscl / (
double) plsc->phyxlen;
296 my = (double) plsc->wpyscl / (
double) plsc->phyylen;
298 dev_x = -my * vec_y / mx;
299 dev_y = mx * vec_x / my;
301 scale = sqrt( ( mx * mx * dev_x * dev_x + my * my * dev_y * dev_y ) /
304 off_x = dev_x / scale;
305 off_y = dev_y / scale;
307 plptex( tpx + off_x, tpy + off_y, vec_x, vec_y, 0.5, flabel );
324 PLINT setpre, precis;
333 #define TMPSTRING_LEN 15
346 tmp = log10( value );
347 else if ( value < 0.0 )
348 tmp = log10( -value );
353 exponent = (int) tmp;
354 else if ( tmp < 0.0 )
357 if ( floor( tmp ) < tmp )
358 exponent = -(
int) ( floor( tmp ) + 1.0 );
360 exponent = -(int) ( floor( tmp ) );
363 mant = value / pow( 10.0, exponent );
366 mant = (int) ( mant * pow( 10.0, prec - 1 ) + 0.5 * mant / fabs( mant ) ) / pow( 10.0, prec - 1 );
369 snprintf(
string, (
size_t) len, form, mant );
371 strncat(
string, tmpstring, (
size_t) len - strlen(
string ) - 1 );
373 if ( abs( exponent ) <
limexp || value == 0.0 )
375 value = pow( 10.0, exponent ) * mant;
378 prec = prec - 1 - exponent;
380 prec = prec - 1 + abs( exponent );
386 snprintf(
string, (
size_t) len, form, value );
395 return ( ( x - plsc->wpxoff ) / plsc->wpxscl );
403 return ( ( y - plsc->wpyoff ) / plsc->wpyscl );
437 value = grid->
f[ix][iy];
456 value = grid->
f[ix * grid->
ny + iy];
475 value = grid->
f[ix + iy * grid->
nx];
498 plcont( f, nx, ny, kx, lx, ky, ly, clevel, nlevel,
521 plabort(
"plcont: The pltr callback must be defined" );
526 nx, ny, kx, lx, ky, ly, clevel, nlevel,
557 if ( kx < 1 || kx >= lx )
559 plabort(
"plfcont: indices must satisfy 1 <= kx <= lx <= nx" );
562 if ( ky < 1 || ky >= ly )
564 plabort(
"plfcont: indices must satisfy 1 <= ky <= ly <= ny" );
568 if ( ( ipts = (
PLINT **) malloc( (
size_t) nx *
sizeof (
PLINT * ) ) ) == NULL )
570 plexit(
"plfcont: Insufficient memory" );
573 for ( i = 0; i < nx; i++ )
575 if ( ( ipts[i] = (
PLINT *) malloc( (
size_t) ny *
sizeof (
PLINT * ) ) ) == NULL )
577 plexit(
"plfcont: Insufficient memory" );
581 for ( i = 0; i < nlevel; i++ )
583 plcntr( f2eval, f2eval_data,
584 nx, ny, kx - 1, lx - 1, ky - 1, ly - 1, clevel[i], ipts,
595 for ( i = 0; i < nx; i++ )
597 free( (
void *) ipts[i] );
599 free( (
void *) ipts );
617 PLINT kcol, krow, lastindex;
619 PLFLT save_def, save_scale;
622 plgchr( &save_def, &save_scale );
623 save_scale = save_scale / save_def;
632 for ( kcol = kx; kcol < lx; kcol++ )
634 for ( krow = ky; krow < ly; krow++ )
636 ipts[kcol][krow] = 0;
641 for ( krow = ky; krow < ly; krow++ )
643 for ( kcol = kx; kcol < lx; kcol++ )
645 if ( ipts[kcol][krow] == 0 )
649 nx, ny, kx, lx, ky, ly, flev, flabel, kcol, krow,
650 0.0, 0.0, -2, ipts, &distance, &lastindex,
658 plschr( save_def, save_scale );
678 PLFLT px[4], py[4], locx[4], locy[4];
680 PLINT i, j, k, num, first, inext, kcolnext, krownext, sfi, sfj;
683 ( *pltr )( kcol, krow + 1, &px[0], &py[0], pltr_data );
684 ( *pltr )( kcol, krow, &px[1], &py[1], pltr_data );
685 ( *pltr )( kcol + 1, krow, &px[2], &py[2], pltr_data );
686 ( *pltr )( kcol + 1, krow + 1, &px[3], &py[3], pltr_data );
688 f[0] = f2eval( kcol, krow + 1, f2eval_data ) - flev;
689 f[1] = f2eval( kcol, krow, f2eval_data ) - flev;
690 f[2] = f2eval( kcol + 1, krow, f2eval_data ) - flev;
691 f[3] = f2eval( kcol + 1, krow + 1, f2eval_data ) - flev;
693 for ( i = 0, j = 1; i < 4; i++, j = ( j + 1 ) % 4 )
697 sfi = ( f[i] > 0.0 ) ? 1 : ( ( f[i] < 0.0 ) ? -1 : 0 );
698 sfj = ( f[j] > 0.0 ) ? 1 : ( ( f[j] < 0.0 ) ? -1 : 0 );
699 iedge[i] = ( sfi * sfj > 0 ) ? -1 : ( ( sfi * sfj < 0 ) ? 1 : 0 );
703 ipts[kcol][krow] = 1;
706 if ( ( iedge[0] == -1 ) && ( iedge[1] == -1 ) && ( iedge[2] == -1 )
707 && ( iedge[3] == -1 ) )
712 if ( ( f[0] == 0.0 ) && ( f[1] == 0.0 ) && ( f[2] == 0.0 ) &&
729 for ( k = 0, i = ( startedge < 0 ? 0 : startedge ); k < 4; k++, i = ( i + 1 ) % 4 )
731 if ( i == startedge )
735 if ( f[i] == 0.0 && f[( i + 1 ) % 4] == 0.0 )
747 if ( ( kcolnext < kx ) || ( kcolnext >= lx ) ||
748 ( krownext < ky ) || ( krownext >= ly ) ||
749 ( ipts[kcolnext][krownext] == 1 ) )
752 if ( ( iedge[i] == 1 ) || ( f[i] == 0.0 ) )
757 locx[num] = ( px[i] * fabs( f[j] ) + px[j] * fabs( f[i] ) ) / fabs( f[j] - f[i] );
758 locy[num] = ( py[i] * fabs( f[j] ) + py[j] * fabs( f[i] ) ) / fabs( f[j] - f[i] );
786 inext = ( i + 2 ) % 4;
795 if ( ( kcolnext >= kx ) && ( kcolnext < lx ) &&
796 ( krownext >= ky ) && ( krownext < ly ) &&
797 ( ipts[kcolnext][krownext] == 0 ) )
800 nx, ny, kx, lx, ky, ly, flev, flabel,
802 locx[num], locy[num], inext, ipts,
815 inext = ( i + 2 ) % 4;
818 kcolnext--; krownext++;
822 krownext--; kcolnext--;
826 kcolnext++; krownext--;
830 krownext++; kcolnext++;
832 if ( ( kcolnext >= kx ) && ( kcolnext < lx ) &&
833 ( krownext >= ky ) && ( krownext < ly ) &&
834 ( ipts[kcolnext][krownext] == 0 ) )
837 nx, ny, kx, lx, ky, ly, flev, flabel,
839 locx[num], locy[num], inext, ipts,
888 PLINT ul, ur, vl, vr;
906 if ( x < 0 || x > nx - 1 || y < 0 || y > ny - 1 )
908 plexit(
"pltr1: Invalid coordinates" );
926 *tx = xl * ( 1 - du ) + xr * du;
935 *ty = yl * ( 1 - dv ) + yr * dv;
955 PLINT ul, ur, vl, vr;
957 PLFLT xll, xlr, xrl, xrr;
958 PLFLT yll, ylr, yrl, yrr;
980 if ( x < xmin || x > xmax || y < ymin || y > ymax )
982 plwarn(
"pltr2: Invalid coordinates" );
1002 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1003 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1006 else if ( x > xmax )
1010 *tx = xg[nx - 1][0];
1011 *ty = yg[nx - 1][0];
1013 else if ( y > ymax )
1015 *tx = xg[nx - 1][ny - 1];
1016 *ty = yg[nx - 1][ny - 1];
1020 xll = xg[nx - 1][vl];
1021 yll = yg[nx - 1][vl];
1022 xlr = xg[nx - 1][vr];
1023 ylr = yg[nx - 1][vr];
1025 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1026 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1038 *tx = xll * ( 1 - du ) + xrl * ( du );
1039 *ty = yll * ( 1 - du ) + yrl * ( du );
1041 else if ( y > ymax )
1043 xlr = xg[ul][ny - 1];
1044 xrr = xg[ur][ny - 1];
1045 ylr = yg[ul][ny - 1];
1046 yrr = yg[ur][ny - 1];
1048 *tx = xlr * ( 1 - du ) + xrr * ( du );
1049 *ty = ylr * ( 1 - du ) + yrr * ( du );
1067 if ( ur == nx && vr < ny )
1072 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1073 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1078 else if ( ur < nx && vr == ny )
1083 *tx = xll * ( 1 - du ) + xrl * ( du );
1084 *ty = yll * ( 1 - du ) + yrl * ( du );
1089 else if ( ur == nx && vr == ny )
1107 *tx = xll * ( 1 - du ) * ( 1 - dv ) + xlr * ( 1 - du ) * ( dv ) +
1108 xrl * ( du ) * ( 1 - dv ) + xrr * ( du ) * ( dv );
1110 *ty = yll * ( 1 - du ) * ( 1 - dv ) + ylr * ( 1 - du ) * ( dv ) +
1111 yrl * ( du ) * ( 1 - dv ) + yrr * ( du ) * ( dv );
1127 PLINT ul, ur, vl, vr;
1129 PLFLT xll, xlr, xrl, xrr;
1130 PLFLT yll, ylr, yrl, yrr;
1152 if ( x < xmin || x > xmax || y < ymin || y > ymax )
1154 plwarn(
"pltr2p: Invalid coordinates" );
1162 else if ( y > ymax )
1164 *tx = *( xg + ( ny - 1 ) );
1165 *ty = *( yg + ( ny - 1 ) );
1170 xll = *( xg + ul * ny + vl );
1171 yll = *( yg + ul * ny + vl );
1172 xlr = *( xg + ul * ny + vr );
1173 ylr = *( yg + ul * ny + vr );
1175 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1176 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1179 else if ( x > xmax )
1183 *tx = *( xg + ( ny - 1 ) * nx );
1184 *ty = *( yg + ( ny - 1 ) * nx );
1186 else if ( y > ymax )
1188 *tx = *( xg + ( ny - 1 ) + ( nx - 1 ) * ny );
1189 *ty = *( yg + ( ny - 1 ) + ( nx - 1 ) * ny );
1194 xll = *( xg + ul * ny + vl );
1195 yll = *( yg + ul * ny + vl );
1196 xlr = *( xg + ul * ny + vr );
1197 ylr = *( yg + ul * ny + vr );
1199 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1200 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1208 xll = *( xg + ul * ny + vl );
1209 xrl = *( xg + ur * ny + vl );
1210 yll = *( yg + ul * ny + vl );
1211 yrl = *( yg + ur * ny + vl );
1213 *tx = xll * ( 1 - du ) + xrl * ( du );
1214 *ty = yll * ( 1 - du ) + yrl * ( du );
1216 else if ( y > ymax )
1219 xlr = *( xg + ul * ny + vr );
1220 xrr = *( xg + ur * ny + vr );
1221 ylr = *( yg + ul * ny + vr );
1222 yrr = *( yg + ur * ny + vr );
1224 *tx = xlr * ( 1 - du ) + xrr * ( du );
1225 *ty = ylr * ( 1 - du ) + yrr * ( du );
1238 xll = *( xg + ul * ny + vl );
1239 yll = *( yg + ul * ny + vl );
1243 if ( ur == nx && vr < ny )
1245 xlr = *( xg + ul * ny + vr );
1246 ylr = *( yg + ul * ny + vr );
1248 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1249 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1254 else if ( ur < nx && vr == ny )
1256 xrl = *( xg + ur * ny + vl );
1257 yrl = *( yg + ur * ny + vl );
1259 *tx = xll * ( 1 - du ) + xrl * ( du );
1260 *ty = yll * ( 1 - du ) + yrl * ( du );
1265 else if ( ur == nx && vr == ny )
1275 xrl = *( xg + ur * ny + vl );
1276 xlr = *( xg + ul * ny + vr );
1277 xrr = *( xg + ur * ny + vr );
1279 yrl = *( yg + ur * ny + vl );
1280 ylr = *( yg + ul * ny + vr );
1281 yrr = *( yg + ur * ny + vr );
1283 *tx = xll * ( 1 - du ) * ( 1 - dv ) + xlr * ( 1 - du ) * ( dv ) +
1284 xrl * ( du ) * ( 1 - dv ) + xrr * ( du ) * ( dv );
1286 *ty = yll * ( 1 - du ) * ( 1 - dv ) + ylr * ( 1 - du ) * ( dv ) +
1287 yrl * ( du ) * ( 1 - dv ) + yrr * ( du ) * ( dv );
1308 PLINT ul, ur, vl, vr;
1310 PLFLT xll, xlr, xrl, xrr;
1311 PLFLT yll, ylr, yrl, yrr;
1333 if ( x < xmin || x > xmax || y < ymin || y > ymax )
1335 plwarn(
"pltr2f: Invalid coordinates" );
1344 else if ( y > ymax )
1346 *tx = *( xg + ( ny - 1 ) * nx );
1347 *ty = *( yg + ( ny - 1 ) * nx );
1352 xll = *( xg + ul + vl * nx );
1353 yll = *( yg + ul + vl * nx );
1354 xlr = *( xg + ul + vr * nx );
1355 ylr = *( yg + ul + vr * nx );
1357 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1358 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1361 else if ( x > xmax )
1365 *tx = *( xg + ( nx - 1 ) );
1366 *ty = *( yg + ( nx - 1 ) );
1368 else if ( y > ymax )
1370 *tx = *( xg + ( nx - 1 ) + ( ny - 1 ) * nx );
1371 *ty = *( yg + ( nx - 1 ) + ( ny - 1 ) * nx );
1376 xll = *( xg + ul + vl * nx );
1377 yll = *( yg + ul + vl * nx );
1378 xlr = *( xg + ul + vr * nx );
1379 ylr = *( yg + ul + vr * nx );
1381 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1382 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1390 xll = *( xg + ul + vl * nx );
1391 xrl = *( xg + ur + vl * nx );
1392 yll = *( yg + ul + vl * nx );
1393 yrl = *( yg + ur + vl * nx );
1395 *tx = xll * ( 1 - du ) + xrl * ( du );
1396 *ty = yll * ( 1 - du ) + yrl * ( du );
1398 else if ( y > ymax )
1401 xlr = *( xg + ul + vr * nx );
1402 xrr = *( xg + ur + vr * nx );
1403 ylr = *( yg + ul + vr * nx );
1404 yrr = *( yg + ur + vr * nx );
1406 *tx = xlr * ( 1 - du ) + xrr * ( du );
1407 *ty = ylr * ( 1 - du ) + yrr * ( du );
1419 xll = *( xg + ul + vl * nx );
1420 yll = *( yg + ul + vl * nx );
1424 if ( ur == nx && vr < ny )
1426 xlr = *( xg + ul + vr * nx );
1427 ylr = *( yg + ul + vr * nx );
1429 *tx = xll * ( 1 - dv ) + xlr * ( dv );
1430 *ty = yll * ( 1 - dv ) + ylr * ( dv );
1435 else if ( ur < nx && vr == ny )
1437 xrl = *( xg + ur + vl * nx );
1438 yrl = *( yg + ur + vl * nx );
1440 *tx = xll * ( 1 - du ) + xrl * ( du );
1441 *ty = yll * ( 1 - du ) + yrl * ( du );
1446 else if ( ur == nx && vr == ny )
1456 xrl = *( xg + ur + vl * nx );
1457 xlr = *( xg + ul + vr * nx );
1458 xrr = *( xg + ur + vr * nx );
1460 yrl = *( yg + ur + vl * nx );
1461 ylr = *( yg + ul + vr * nx );
1462 yrr = *( yg + ur + vr * nx );
1463 *tx = xll * ( 1 - du ) * ( 1 - dv ) + xlr * ( 1 - du ) * ( dv ) +
1464 xrl * ( du ) * ( 1 - dv ) + xrr * ( du ) * ( dv );
1466 *ty = yll * ( 1 - du ) * ( 1 - dv ) + ylr * ( 1 - du ) * ( dv ) +
1467 yrl * ( du ) * ( 1 - dv ) + yrr * ( du ) * ( dv );