129 #define NUMBER_BISECTIONS 10
131 #define linear( val1, val2, level ) ( ( level - val1 ) / ( val2 - val1 ) )
159 big_recl(
int *cond_code,
register int ny,
int dx,
int dy,
196 xmin, xmax, ymin, ymax,
197 clevel, nlevel, fill_width,
198 cont_color, cont_width,
224 xmin, xmax, ymin, ymax,
225 clevel, nlevel, fill_width,
226 cont_color, cont_width,
253 PLFLT shade_min, shade_max, shade_color;
255 PLFLT init_width, color_min, color_max, color_range;
258 color_min = plsc->cmap1_min;
259 color_max = plsc->cmap1_max;
260 color_range = color_max - color_min;
262 for ( i = 0; i < nlevel - 1; i++ )
264 shade_min = clevel[i];
265 shade_max = clevel[i + 1];
266 shade_color = color_min + i / (
PLFLT) ( nlevel - 2 ) * color_range;
273 plfshade1( zops, zp, nx, ny, defined, xmin, xmax, ymin, ymax,
274 shade_min, shade_max,
275 1, shade_color, fill_width,
277 fill, rectangular, pltr, pltr_data );
279 if ( cont_color > 0 && cont_width > 0 )
281 init_color = plsc->icol0;
282 init_width = plsc->width;
287 plfcont( zops->
f2eval, zp, nx, ny, 1, nx, 1, ny, clevel, nlevel, pltr, pltr_data );
300 x = (
PLFLT *) malloc( (
size_t) nx *
sizeof (
PLFLT ) );
302 plexit(
"plfshades: Out of memory for x" );
304 for ( i = 0; i < nx; i++ )
305 cgrid1.
xg[i] = xmin + ( xmax - xmin ) * (float) i / (
float) ( nx - 1 );
306 y = (
PLFLT *) malloc( (
size_t) ny *
sizeof (
PLFLT ) );
308 plexit(
"plfshades: Out of memory for y" );
310 for ( i = 0; i < ny; i++ )
311 cgrid1.
yg[i] = ymin + ( ymax - ymin ) * (float) i / (
float) ( ny - 1 );
312 plfcont( zops->
f2eval, zp, nx, ny, 1, nx, 1, ny, clevel, nlevel,
313 pltr1, (
void *) &cgrid1 );
337 defined, nx, ny, xmin,
338 xmax, ymin, ymax, shade_min, shade_max,
339 sh_cmap, sh_color, sh_width,
340 min_color, min_width, max_color, max_width,
341 fill, rectangular, NULL, NULL );
364 defined, nx, ny, xmin,
365 xmax, ymin, ymax, shade_min, shade_max,
366 sh_cmap, sh_color, sh_width,
367 min_color, min_width, max_color, max_width,
368 fill, rectangular, pltr, pltr_data );
397 defined, nx, ny, xmin,
398 xmax, ymin, ymax, shade_min, shade_max,
399 sh_cmap, sh_color, sh_width,
400 min_color, min_width, max_color, max_width,
401 fill, rectangular, pltr, pltr_data );
423 plshade_int( f2eval, f2eval_data, c2eval, c2eval_data,
425 nx, ny, xmin, xmax, ymin, ymax,
426 shade_min, shade_max, sh_cmap, sh_color, sh_width,
427 min_color, min_width, max_color, max_width,
428 fill, rectangular, pltr, pltr_data );
456 defined, nx, ny, xmin,
457 xmax, ymin, ymax, shade_min, shade_max,
458 sh_cmap, sh_color, sh_width,
459 min_color, min_width, max_color, max_width,
460 fill, rectangular, pltr, pltr_data );
506 PLINT n, slope = 0, ix, iy;
507 int count, i, j, nxny;
508 PLFLT *a, *a0, *a1, dx, dy;
509 PLFLT x[8], y[8], xp[2], tx, ty, init_width;
514 if ( plsc->level < 3 )
516 plabort(
"plfshade: window must be set up first" );
520 if ( nx <= 0 || ny <= 0 )
522 plabort(
"plfshade: nx and ny must be positive" );
526 if ( shade_min >= shade_max )
528 plabort(
"plfshade: shade_max must exceed shade_min" );
532 if ( pltr == NULL && plsc->coordinate_transform == NULL )
535 int_val = shade_max - shade_min;
536 init_width = plsc->width;
557 plabort(
"plfshade: invalid color map selection" );
564 if ( ( a = (
PLFLT *) malloc( (
size_t) nxny *
sizeof (
PLFLT ) ) ) == NULL )
566 plabort(
"plfshade: unable to allocate memory for value array" );
570 for ( ix = 0; ix < nx; ix++ )
571 for ( iy = 0; iy < ny; iy++ )
572 a[iy + ix * ny] = f2eval( ix, iy, f2eval_data );
576 if ( ( c = (
int *) malloc( (
size_t) nxny *
sizeof (
int ) ) ) == NULL )
578 plabort(
"plfshade: unable to allocate memory for condition codes" );
587 dx = ( xmax - xmin ) / ( nx - 1 );
588 dy = ( ymax - ymin ) / ( ny - 1 );
594 for ( ix = 0; ix < nx - 1; ix++ )
596 for ( iy = 0; iy < ny - 1; iy++ )
598 count = c0[iy] + c0[iy + 1] + c1[iy] + c1[iy + 1];
602 if ( count >=
UNDEF )
604 if ( count == 4 *
POS )
606 if ( count == 4 *
NEG )
611 if ( count == 4 *
OK )
616 big_recl( c0 + iy, ny, nx - ix, ny - iy, &i, &j );
623 x[2] = x[3] = ix + i;
625 y[1] = y[2] = iy + j;
629 for ( i = 0; i < 4; i++ )
631 ( *pltr )( x[i], y[i], &tx, &ty, pltr_data );
638 for ( i = 0; i < 4; i++ )
640 x[i] = xmin + x[i] * dx;
641 y[i] = ymin + y[i] * dy;
653 n =
find_interval( a0[iy], a0[iy + 1], c0[iy], c0[iy + 1], xp );
654 for ( j = 0; j < n; j++ )
661 c0[iy + 1], c1[iy + 1], xp );
663 for ( j = 0; j < i; j++ )
665 x[j + n] = ix + xp[j];
670 i =
find_interval( a1[iy + 1], a1[iy], c1[iy + 1], c1[iy], xp );
671 for ( j = 0; j < i; j++ )
674 y[n + j] = iy + 1 - xp[j];
679 for ( j = 0; j < i; j++ )
681 x[n + j] = ix + 1 - xp[j];
688 for ( i = 0; i < n; i++ )
690 ( *pltr )( x[i], y[i], &tx, &ty, pltr_data );
697 for ( i = 0; i < n; i++ )
699 x[i] = xmin + x[i] * dx;
700 y[i] = ymin + y[i] * dy;
705 slope =
plctestez( a, nx, ny, ix, iy, shade_min );
707 slope =
plctestez( a, nx, ny, ix, iy, shade_max );
721 if ( fill != NULL && n > 0 )
722 exfill( fill, defined, n, x, y );
727 fprintf( stderr,
"plfshade err n=%d !6", (
int) n );
728 if ( slope == 1 && c0[iy] ==
OK )
731 exfill( fill, defined, n, x, y );
733 else if ( slope == 1 )
738 else if ( c0[iy + 1] ==
OK )
741 exfill( fill, defined, n, x, y );
751 fprintf( stderr,
"plfshade err n=%d !8", (
int) n );
767 fprintf( stderr,
"plfshade err n=%d !7", (
int) n );
769 if ( ( c0[iy] ==
OK || c1[iy + 1] ==
OK ) && slope == 1 )
772 exfill( fill, defined, n, x, y );
774 else if ( ( c0[iy + 1] ==
OK || c1[iy] ==
OK ) && slope == 0 )
777 exfill( fill, defined, n, x, y );
780 else if ( c0[iy] ==
OK )
785 else if ( c0[iy + 1] ==
OK )
790 else if ( c1[iy + 1] ==
OK )
795 else if ( c1[iy] ==
OK )
802 fprintf( stderr,
"plfshade err logic case 024:042\n" );
806 fprintf( stderr,
"prog err switch\n" );
816 else if ( sh_cmap == 1 )
847 else if (
isnan( *a ) )
880 if ( c0 ==
NEG || c1 ==
POS )
893 if ( c0 ==
POS || c1 ==
NEG )
920 register PLINT n = 0;
970 xm = ( x1 + x2 ) / 2.;
971 ym = ( y1 + y2 ) / 2.;
973 if ( defined( xm, ym ) )
974 bisect( defined, niter - 1, xm, ym, x2, y2, xb, yb );
976 bisect( defined, niter - 1, x1, y1, xm, ym, xb, yb );
999 plabort(
"exfill: Not enough points in object" );
1003 if ( defined == NULL )
1005 ( *fill )( n, x, y );
1014 PLINT is_defined = defined( x[im1], y[im1] );
1019 if ( ( xx = (
PLFLT *) malloc( 2 * (
size_t) n *
sizeof (
PLFLT ) ) ) == NULL )
1020 plexit(
"exfill: out of memory for xx" );
1021 if ( ( yy = (
PLFLT *) malloc( 2 * (
size_t) n *
sizeof (
PLFLT ) ) ) == NULL )
1022 plexit(
"exfill: out of memory for yy." );
1024 for ( i = 0; i < n; i++ )
1027 if ( defined( x[i], y[i] ) )
1035 x[i], y[i], x[im1], y[im1], &xb, &yb );
1053 x[im1], y[im1], x[i], y[i], &xb, &yb );
1094 #define COND( x, y ) cond_code[x * ny + y]
1097 big_recl(
int *cond_code,
register int ny,
int dx,
int dy,
1101 register int i, x, y;
1110 while ( ok_x || ok_y )
1122 cond = &
COND( 0, y );
1123 for ( i = 0; i < x; i++ )
1144 cond = &
COND( x, 0 );
1145 for ( i = 0; i < y; i++ )
1147 if ( *cond++ !=
OK )
1165 for ( i = 1; i < x; i++ )
1167 cond = &
COND( i, 1 );
1168 for ( j = 1; j < y; j++ )
1197 pljoin( x[
min_pts[0]], y[min_pts[0]], x[min_pts[1]], y[min_pts[1]] );
1200 pljoin( x[min_pts[2]], y[min_pts[2]], x[min_pts[3]],
1215 pljoin( x[
max_pts[0]], y[max_pts[0]], x[max_pts[1]], y[max_pts[1]] );
1218 pljoin( x[max_pts[2]], y[max_pts[2]], x[max_pts[3]],
1257 #define X( a, b ) ( x[a * 4 + b] )
1258 #define POSITIVE_SLOPE (PLINT) 1
1259 #define NEGATIVE_SLOPE (PLINT) 0
1260 #define RATIO_SQ 6.0
1266 double t[4], sorted[4], temp;
1268 sorted[0] = t[0] =
X( 1, 1 );
1269 sorted[1] = t[1] =
X( 2, 2 );
1270 sorted[2] = t[2] =
X( 1, 2 );
1271 sorted[3] = t[3] =
X( 2, 1 );
1273 for ( j = 1; j < 4; j++ )
1277 while ( i >= 0 && sorted[i] > temp )
1279 sorted[i + 1] = sorted[i];
1282 sorted[i + 1] = temp;
1288 if ( temp < sorted[1] )
1291 for ( i = 0; i < 4; i++ )
1300 if ( temp > sorted[2] )
1303 for ( i = 0; i < 4; i++ )
1329 for ( i = 0; i < 4; i++ )
1333 ii =
MIN( ii, nx - 1 );
1334 for ( j = 0; j < 4; j++ )
1338 jj =
MIN( jj, ny - 1 );
1339 x[i][j] = a[ii * ny + jj];
1342 return plctest( &( x[0][0] ), level );
void plexit(PLCHAR_VECTOR errormsg)
PLFLT plf2eval(PLINT ix, PLINT iy, PLPointer plf2eval_data)
#define linear(val1, val2, level)
const PLFLT *const * PLFLT_MATRIX
static void set_cond(register int *cond, register PLFLT *a, register PLINT n)
void plabort(PLCHAR_VECTOR errormsg)
PLINT(* PLDEFINED_callback)(PLFLT x, PLFLT y)
PLFLT(* PLF2EVAL_callback)(PLINT ix, PLINT iy, PLPointer data)
static PLINT plctest(PLFLT *x, PLFLT level)
void(* PLFILL_callback)(PLINT n, PLFLT_VECTOR x, PLFLT_VECTOR y)
void plfshade1(PLF2OPS zops, PLPointer zp, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data)
PLFLT(* f2eval)(PLINT ix, PLINT iy, PLPointer p)
#define NUMBER_BISECTIONS
static void plshade_int(PLF2EVAL_callback f2eval, PLPointer f2eval_data, PLF2EVAL_callback c2eval, PLPointer c2eval_data, PLDEFINED_callback defined, PLINT nx, PLINT ny, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data)
static PLINT plctestez(PLFLT *a, PLINT nx, PLINT ny, PLINT ix, PLINT iy, PLFLT level)
void c_plshade1(PLFLT_VECTOR a, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data)
PLFLT plf2eval1(PLINT ix, PLINT iy, PLPointer plf2eval_data)
void plfshades(PLF2OPS zops, PLPointer zp, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT_VECTOR clevel, PLINT nlevel, PLFLT fill_width, PLINT cont_color, PLFLT cont_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data)
static void bisect(PLDEFINED_callback defined, PLINT niter, PLFLT x1, PLFLT y1, PLFLT x2, PLFLT y2, PLFLT *xb, PLFLT *yb)
static void draw_boundary(PLINT slope, PLFLT *x, PLFLT *y)
void(* PLTRANSFORM_callback)(PLFLT x, PLFLT y, PLFLT_NC_SCALAR xp, PLFLT_NC_SCALAR yp, PLPointer data)
void c_plshades(PLFLT_MATRIX a, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT_VECTOR clevel, PLINT nlevel, PLFLT fill_width, PLINT cont_color, PLFLT cont_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data)
static void selected_polygon(PLFILL_callback fill, PLDEFINED_callback defined, PLFLT_VECTOR x, PLFLT_VECTOR y, PLINT v1, PLINT v2, PLINT v3, PLINT v4)
void plfshade(PLF2EVAL_callback f2eval, PLPointer f2eval_data, PLF2EVAL_callback c2eval, PLPointer c2eval_data, PLINT nx, PLINT ny, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data)
static void exfill(PLFILL_callback fill, PLDEFINED_callback defined, int n, PLFLT_VECTOR x, PLFLT_VECTOR y)
static void big_recl(int *cond_code, register int ny, int dx, int dy, int *ix, int *iy)
static int find_interval(PLFLT a0, PLFLT a1, PLINT c0, PLINT c1, PLFLT *x)
void c_plshade(PLFLT_MATRIX a, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data)
const PLFLT * PLFLT_VECTOR
void plfcont(PLF2EVAL_callback f2eval, PLPointer f2eval_data, PLINT nx, PLINT ny, PLINT kx, PLINT lx, PLINT ky, PLINT ly, PLFLT_VECTOR clevel, PLINT nlevel, PLTRANSFORM_callback pltr, PLPointer pltr_data)
PLDLLIMPEXP void plshades_null(PLFLT_MATRIX a, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT_VECTOR clevel, PLINT nlevel, PLFLT fill_width, PLINT cont_color, PLFLT cont_width, PLFILL_callback fill, PLINT rectangular)
PLDLLIMPEXP_CXX void fill(PLINT n, const PLFLT *x, const PLFLT *y)
PLDLLIMPEXP void plshade_null(PLFLT_MATRIX a, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular)