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)