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 );
   400         defined, nx, ny, xmin,
   401         xmax, ymin, ymax, shade_min, shade_max,
   402         sh_cmap, sh_color, sh_width,
   403         min_color, min_width, max_color, max_width,
   404         fill, rectangular, pltr, pltr_data );
   406 #endif //PL_DEPRECATED   427     plshade_int( f2eval, f2eval_data, c2eval, c2eval_data,
   429         nx, ny, xmin, xmax, ymin, ymax,
   430         shade_min, shade_max, sh_cmap, sh_color, sh_width,
   431         min_color, min_width, max_color, max_width,
   432         fill, rectangular, pltr, pltr_data );
   460         defined, nx, ny, xmin,
   461         xmax, ymin, ymax, shade_min, shade_max,
   462         sh_cmap, sh_color, sh_width,
   463         min_color, min_width, max_color, max_width,
   464         fill, rectangular, pltr, pltr_data );
   510     PLINT n, slope = 0, ix, iy;
   511     int   count, i, j, nxny;
   512     PLFLT *a, *a0, *a1, dx, dy;
   513     PLFLT x[8], y[8], xp[2], tx, ty, init_width;
   518     if ( plsc->level < 3 )
   520         plabort( 
"plfshade: window must be set up first" );
   524     if ( nx <= 0 || ny <= 0 )
   526         plabort( 
"plfshade: nx and ny must be positive" );
   530     if ( shade_min >= shade_max )
   532         plabort( 
"plfshade: shade_max must exceed shade_min" );
   536     if ( pltr == NULL && plsc->coordinate_transform == NULL )
   539     int_val    = shade_max - shade_min;
   540     init_width = plsc->width;
   561             plabort( 
"plfshade: invalid color map selection" );
   568     if ( ( a = (
PLFLT *) malloc( (
size_t) nxny * 
sizeof ( 
PLFLT ) ) ) == NULL )
   570         plabort( 
"plfshade: unable to allocate memory for value array" );
   574     for ( ix = 0; ix < nx; ix++ )
   575         for ( iy = 0; iy < ny; iy++ )
   576             a[iy + ix * ny] = f2eval( ix, iy, f2eval_data );
   580     if ( ( c = (
int *) malloc( (
size_t) nxny * 
sizeof ( 
int ) ) ) == NULL )
   582         plabort( 
"plfshade: unable to allocate memory for condition codes" );
   591     dx = ( xmax - xmin ) / ( nx - 1 );
   592     dy = ( ymax - ymin ) / ( ny - 1 );
   598     for ( ix = 0; ix < nx - 1; ix++ )
   600         for ( iy = 0; iy < ny - 1; iy++ )
   602             count = c0[iy] + c0[iy + 1] + c1[iy] + c1[iy + 1];
   606             if ( count >= 
UNDEF )
   608             if ( count == 4 * 
POS )
   610             if ( count == 4 * 
NEG )
   615             if ( count == 4 * 
OK )
   620                     big_recl( c0 + iy, ny, nx - ix, ny - iy, &i, &j );
   627                 x[2] = x[3] = ix + i;
   629                 y[1] = y[2] = iy + j;
   633                     for ( i = 0; i < 4; i++ )
   635                         ( *pltr )( x[i], y[i], &tx, &ty, pltr_data );
   642                     for ( i = 0; i < 4; i++ )
   644                         x[i] = xmin + x[i] * dx;
   645                         y[i] = ymin + y[i] * dy;
   657             n       = 
find_interval( a0[iy], a0[iy + 1], c0[iy], c0[iy + 1], xp );
   658             for ( j = 0; j < n; j++ )
   665                 c0[iy + 1], c1[iy + 1], xp );
   667             for ( j = 0; j < i; j++ )
   669                 x[j + n] = ix + xp[j];
   674             i = 
find_interval( a1[iy + 1], a1[iy], c1[iy + 1], c1[iy], xp );
   675             for ( j = 0; j < i; j++ )
   678                 y[n + j] = iy + 1 - xp[j];
   683             for ( j = 0; j < i; j++ )
   685                 x[n + j] = ix + 1 - xp[j];
   692                 for ( i = 0; i < n; i++ )
   694                     ( *pltr )( x[i], y[i], &tx, &ty, pltr_data );
   701                 for ( i = 0; i < n; i++ )
   703                     x[i] = xmin + x[i] * dx;
   704                     y[i] = ymin + y[i] * dy;
   709                 slope = 
plctestez( a, nx, ny, ix, iy, shade_min );
   711                 slope = 
plctestez( a, nx, ny, ix, iy, shade_max );
   725                 if ( fill != NULL && n > 0 )
   726                     exfill( fill, defined, n, x, y );
   731                     fprintf( stderr, 
"plfshade err n=%d !6", (
int) n );
   732                 if ( slope == 1 && c0[iy] == 
OK )
   735                         exfill( fill, defined, n, x, y );
   737                 else if ( slope == 1 )
   742                 else if ( c0[iy + 1] == 
OK )
   745                         exfill( fill, defined, n, x, y );
   755                     fprintf( stderr, 
"plfshade err n=%d !8", (
int) n );
   771                     fprintf( stderr, 
"plfshade err n=%d !7", (
int) n );
   773                 if ( ( c0[iy] == 
OK || c1[iy + 1] == 
OK ) && slope == 1 )
   776                         exfill( fill, defined, n, x, y );
   778                 else if ( ( c0[iy + 1] == 
OK || c1[iy] == 
OK ) && slope == 0 )
   781                         exfill( fill, defined, n, x, y );
   784                 else if ( c0[iy] == 
OK )
   789                 else if ( c0[iy + 1] == 
OK )
   794                 else if ( c1[iy + 1] == 
OK )
   799                 else if ( c1[iy] == 
OK )
   806                     fprintf( stderr, 
"plfshade err logic case 024:042\n" );
   810                 fprintf( stderr, 
"prog err switch\n" );
   820                 else if ( sh_cmap == 1 )
   851         else if ( 
isnan( *a ) ) 
   884     if ( c0 == 
NEG || c1 == 
POS )
   897     if ( c0 == 
POS || c1 == 
NEG )
   924     register PLINT n = 0;
   974     xm = ( x1 + x2 ) / 2.;
   975     ym = ( y1 + y2 ) / 2.;
   977     if ( defined( xm, ym ) )
   978         bisect( defined, niter - 1, xm, ym, x2, y2, xb, yb );
   980         bisect( defined, niter - 1, x1, y1, xm, ym, xb, yb );
  1003         plabort( 
"exfill: Not enough points in object" );
  1007     if ( defined == NULL )
  1009         ( *fill )( n, x, y );
  1018         PLINT is_defined = defined( x[im1], y[im1] );
  1023         if ( ( xx = (
PLFLT *) malloc( 2 * (
size_t) n * 
sizeof ( 
PLFLT ) ) ) == NULL )
  1024             plexit( 
"exfill: out of memory for xx" );
  1025         if ( ( yy = (
PLFLT *) malloc( 2 * (
size_t) n * 
sizeof ( 
PLFLT ) ) ) == NULL )
  1026             plexit( 
"exfill: out of memory for yy." );
  1028         for ( i = 0; i < n; i++ )
  1031             if ( defined( x[i], y[i] ) )
  1039                         x[i], y[i], x[im1], y[im1], &xb, &yb );
  1057                         x[im1], y[im1], x[i], y[i], &xb, &yb );
  1098 #define COND( x, y )    cond_code[x * ny + y]  1101 big_recl( 
int *cond_code, 
register int ny, 
int dx, 
int dy,
  1105     register int i, x, y;
  1114     while ( ok_x || ok_y )
  1126             cond = &
COND( 0, y );
  1127             for ( i = 0; i < x; i++ )
  1148             cond = &
COND( x, 0 );
  1149             for ( i = 0; i < y; i++ )
  1151                 if ( *cond++ != 
OK )
  1169     for ( i = 1; i < x; i++ )
  1171         cond = &
COND( i, 1 );
  1172         for ( j = 1; j < y; j++ )
  1201         pljoin( x[
min_pts[0]], y[min_pts[0]], x[min_pts[1]], y[min_pts[1]] );
  1204             pljoin( x[min_pts[2]], y[min_pts[2]], x[min_pts[3]],
  1219         pljoin( x[
max_pts[0]], y[max_pts[0]], x[max_pts[1]], y[max_pts[1]] );
  1222             pljoin( x[max_pts[2]], y[max_pts[2]], x[max_pts[3]],
  1261 #define X( a, b )    ( x[a * 4 + b] )  1262 #define POSITIVE_SLOPE    (PLINT) 1  1263 #define NEGATIVE_SLOPE    (PLINT) 0  1264 #define RATIO_SQ          6.0  1270     double t[4], sorted[4], temp;
  1272     sorted[0] = t[0] = 
X( 1, 1 );
  1273     sorted[1] = t[1] = 
X( 2, 2 );
  1274     sorted[2] = t[2] = 
X( 1, 2 );
  1275     sorted[3] = t[3] = 
X( 2, 1 );
  1277     for ( j = 1; j < 4; j++ )
  1281         while ( i >= 0 && sorted[i] > temp )
  1283             sorted[i + 1] = sorted[i];
  1286         sorted[i + 1] = temp;
  1292     if ( temp < sorted[1] )
  1295         for ( i = 0; i < 4; i++ )
  1304     if ( temp > sorted[2] )
  1307         for ( i = 0; i < 4; i++ )
  1333     for ( i = 0; i < 4; i++ )
  1337         ii = 
MIN( ii, nx - 1 );
  1338         for ( j = 0; j < 4; j++ )
  1342             jj      = 
MIN( jj, ny - 1 );
  1343             x[i][j] = a[ii * ny + jj];
  1346     return plctest( &( x[0][0] ), level );
 
void plexit(PLCHAR_VECTOR errormsg)
void(* PLTRANSFORM_callback)(PLFLT x, PLFLT y, PLFLT_NC_SCALAR xp, PLFLT_NC_SCALAR yp, PLPointer data)
void(* PLFILL_callback)(PLINT n, PLFLT_VECTOR x, PLFLT_VECTOR y)
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)
PLFLT(* PLF2EVAL_callback)(PLINT ix, PLINT iy, PLPointer data)
void plabort(PLCHAR_VECTOR errormsg)
PLINT(* PLDEFINED_callback)(PLFLT x, PLFLT y)
static PLINT plctest(PLFLT *x, PLFLT level)
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)
#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)
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 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)
PLFLT(* f2eval)(PLINT ix, PLINT iy, PLPointer p)
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)