30 #define BINC 50 // Block size for memory allocation
70 static void myexit(
const char * );
71 static void myabort(
const char * );
168 PLFLT *in, *T[3], *TT = NULL;
174 in = (
PLFLT *) malloc(
sizeof (
PLFLT ) * (size_t) Ni );
175 TT = (
PLFLT *) malloc( 3 *
sizeof (
PLFLT ) * (size_t) Ni );
177 if ( in == NULL || TT == NULL )
179 plexit(
"plP_clip_poly: insufficient memory for large polygon" );
194 for ( i = 0; i < Ni; i++ )
196 in[i] = Vi[axis][i] * dir +
offset;
212 for ( i = 0; i < 3; i++ )
214 for ( j = 0; j < Ni; j++ )
220 for ( i = 0; i < Ni; i++ )
224 if ( in[i] >= 0 && in[j] >= 0 )
226 for ( k = 0; k < 3; k++ )
230 else if ( in[i] >= 0 && in[j] < 0 )
232 PLFLT u = in[i] / ( in[i] - in[j] );
233 for ( k = 0; k < 3; k++ )
234 Vi[k][No] = T[k][i] * ( 1 - u ) + T[k][j] * u;
237 else if ( in[i] < 0 && in[j] >= 0 )
239 PLFLT u = in[i] / ( in[i] - in[j] );
240 for ( k = 0; k < 3; k++ )
241 Vi[k][No] = T[k][i] * ( 1 - u ) + T[k][j] * u;
243 for ( k = 0; k < 3; k++ )
267 PLFLT x[6], y[6], z[6];
272 plP_gdom( &xmin, &xmax, &ymin, &ymax );
275 x[0] = x0; x[1] = x1; x[2] = x2;
276 y[0] = y0; y[1] = y1; y[2] = y2;
277 z[0] = z0; z[1] = z1; z[2] = z2;
280 V[0] = x; V[1] = y; V[2] = z;
296 for ( i = 0; i < n; i++ )
304 #ifdef SHADE_DEBUG // show triangles
306 x[3] = x[0]; y[3] = y[0]; z[3] = z[0];
308 #else // fill triangles
328 opt, clevel, nlevel );
339 if ( !indexymin || !indexymax )
340 plexit(
"plsurf3d: Out of memory." );
341 for ( i = 0; i < nx; i++ )
346 plfsurf3dl( x, y, zops, zp, nx, ny, opt, clevel, nlevel,
347 0, nx, indexymin, indexymax );
392 opt, clevel, nlevel, indexxmin, indexxmax, indexymin, indexymax );
400 PLFLT cxx, cxy, cyx, cyy, cyz;
402 PLINT ixDir, ixOrigin, iyDir, iyOrigin, nFast, nSlow;
403 PLINT ixFast, ixSlow, iyFast, iySlow;
407 PLINT ixmin = 0, ixmax = nx, iymin = 0, iymax = ny;
408 PLFLT xx[3], yy[3], zz[3];
409 PLFLT px[4], py[4], pz[4];
412 int ct, ix, iy, iftriangle;
413 PLINT color = plsc->icol0;
414 PLFLT width = plsc->width;
417 if ( plsc->level < 3 )
419 myabort(
"plsurf3dl: Please set up window first" );
423 if ( nx <= 0 || ny <= 0 )
425 myabort(
"plsurf3dl: Bad array dimensions." );
440 plwarn(
"plsurf3dl: Maximum and minimum Z values are equal! \"fixing\"..." );
449 plP_gdom( &xmin, &xmax, &ymin, &ymax );
460 for ( i = 0; i < nx - 1; i++ )
462 if ( x[i] >= x[i + 1] )
464 myabort(
"plsurf3dl: X array must be strictly increasing" );
467 if ( x[i] < xmin && x[i + 1] >= xmin )
469 if ( x[i + 1] > xmax && x[i] <= xmax )
472 for ( i = 0; i < ny - 1; i++ )
474 if ( y[i] >= y[i + 1] )
476 myabort(
"plsurf3dl: Y array must be strictly increasing" );
479 if ( y[i] < ymin && y[i + 1] >= ymin )
481 if ( y[i + 1] > ymax && y[i] <= ymax )
486 plP_gw3wc( &cxx, &cxy, &cyx, &cyy, &cyz );
505 ixOrigin = ixmax - 1;
511 iyOrigin = iymax - 1;
519 if ( fabs( cxx ) > fabs( cxy ) )
522 nFast = ixmax - ixmin;
523 nSlow = iymax - iymin;
525 ixFast = ixDir; ixSlow = 0;
526 iyFast = 0; iySlow = iyDir;
530 nFast = iymax - iymin;
531 nSlow = ixmax - ixmin;
533 ixFast = 0; ixSlow = ixDir;
534 iyFast = iyDir; iySlow = 0;
540 PLFLT bx[3], by[3], bz[3];
548 bx[0] = ( ixOrigin != ixmin && ixFast == 0 ) || ixFast > 0 ? xmax : xmin;
549 by[0] = ( iyOrigin != iymin && iyFast == 0 ) || iyFast > 0 ? ymax : ymin;
550 bx[1] = ixOrigin != ixmin ? xmax :
xmin;
551 by[1] = iyOrigin != iymin ? ymax :
ymin;
552 bx[2] = ( ixOrigin != ixmin && ixSlow == 0 ) || ixSlow > 0 ? xmax : xmin;
553 by[2] = ( iyOrigin != iymin && iySlow == 0 ) || iySlow > 0 ? ymax : ymin;
557 for ( tp = tick * floor( zmin / tick ) + tick; tp <= zmax; tp += tick )
559 bz[0] = bz[1] = bz[2] = tp;
586 plexit(
"plsurf3dl: Insufficient memory" );
597 for ( i = indexxmin; i < indexxmax; i++ )
599 for ( j = 0; j < indexymin[i]; j++ )
601 cgrid2.
xg[i][j] = x[i];
602 cgrid2.
yg[i][j] = y[indexymin[i]];
603 zstore[i][j] = getz( zp, i, indexymin[i] );
605 for ( j = indexymin[i]; j < indexymax[i]; j++ )
607 cgrid2.
xg[i][j] = x[i];
608 cgrid2.
yg[i][j] = y[j];
609 zstore[i][j] = getz( zp, i, j );
611 for ( j = indexymax[i]; j < ny; j++ )
613 cgrid2.
xg[i][j] = x[i];
614 cgrid2.
yg[i][j] = y[indexymax[i] - 1];
615 zstore[i][j] = getz( zp, i, indexymax[i] - 1 );
619 cont_store( (
const PLFLT *
const *) zstore, nx, ny, indexxmin + 1, indexxmax, 1, ny,
620 clevel, nlevel,
pltr2, (
void *) &cgrid2, &cont );
634 if ( cline->
npts > np )
637 if ( ( zzloc = (
PLFLT *) realloc( zzloc, (
size_t) np *
sizeof (
PLFLT ) ) ) == NULL )
639 plexit(
"plsurf3dl: Insufficient memory" );
642 for ( j = 0; j < cline->
npts; j++ )
643 zzloc[j] = plsc->ranmi;
644 if ( cline->
npts > 0 )
651 while ( cline != NULL );
654 while ( clev != NULL );
661 for ( iSlow = 0; iSlow < nSlow - 1; iSlow++ )
663 for ( iFast = 0; iFast < nFast - 1; iFast++ )
675 for ( i = 0; i < 2; i++ )
677 for ( j = 0; j < 2; j++ )
681 ix = ixFast * ( iFast + i ) + ixSlow * ( iSlow + j ) + ixOrigin;
682 iy = iyFast * ( iFast + i ) + iySlow * ( iSlow + j ) + iyOrigin;
684 if ( indexxmin <= ix && ix < indexxmax &&
685 indexymin[ix] <= iy && iy < indexymax[ix] )
687 xm += px[2 * i + j] = x[ix];
688 ym += py[2 * i + j] = y[iy];
689 zm += pz[2 * i + j] = getz( zp, ix, iy );
697 if ( iftriangle == 0 )
701 if ( iftriangle == 0 )
706 xm /= 4.; ym /= 4.; zm /= 4.;
710 for ( i = 1; i < 3; i++ )
712 for ( j = 0; j < 4; j += 3 )
714 shade_triangle( px[j], py[j], pz[j], xm, ym, zm, px[i], py[i], pz[i] );
719 if ( clevel != NULL && ( opt &
SURF_CONT ) )
721 for ( i = 1; i < 3; i++ )
723 for ( j = 0; j < 4; j += 3 )
724 #define
min3( a, b, c ) (
MIN( (
MIN( a, b ) ), c ) )
725 #define
max3( a, b, c ) (
MAX( (
MAX( a, b ) ), c ) )
728 for ( k = 0; k < nlevel; k++ )
730 if ( clevel[k] >=
min3( pz[i], zm, pz[j] ) && clevel[k] <
max3( pz[i], zm, pz[j] ) )
733 if ( clevel[k] >=
MIN( pz[i], zm ) && clevel[k] <
MAX( pz[i], zm ) )
735 xx[ct] = ( ( clevel[k] - pz[i] ) * ( xm - px[i] ) ) / ( zm - pz[i] ) + px[i];
736 yy[ct] = ( ( clevel[k] - pz[i] ) * ( ym - py[i] ) ) / ( zm - pz[i] ) + py[i];
740 if ( clevel[k] >=
MIN( pz[i], pz[j] ) && clevel[k] <
MAX( pz[i], pz[j] ) )
742 xx[ct] = ( ( clevel[k] - pz[i] ) * ( px[j] - px[i] ) ) / ( pz[j] - pz[i] ) + px[i];
743 yy[ct] = ( ( clevel[k] - pz[i] ) * ( py[j] - py[i] ) ) / ( pz[j] - pz[i] ) + py[i];
747 if ( clevel[k] >=
MIN( pz[j], zm ) && clevel[k] <
MAX( pz[j], zm ) )
749 xx[ct] = ( ( clevel[k] - pz[j] ) * ( xm - px[j] ) ) / ( zm - pz[j] ) + px[j];
750 yy[ct] = ( ( clevel[k] - pz[j] ) * ( ym - py[j] ) ) / ( zm - pz[j] ) + py[j];
762 zz[0] = zz[1] = clevel[k];
768 plwarn(
"plsurf3dl: ***ERROR***\n" );
781 indexxmin, indexxmax, indexymin, indexymax );
790 for ( iFast = 0; iFast < nFast - 1; iFast++ )
792 for ( i = 0; i < 2; i++ )
794 ix = ixFast * ( iFast + i ) + ixSlow * iSlow + ixOrigin;
795 iy = iyFast * ( iFast + i ) + iySlow * iSlow + iyOrigin;
796 if ( indexxmin <= ix && ix < indexxmax &&
797 indexymin[ix] <= iy && iy < indexymax[ix] )
801 pz[2 * i] = getz( zp, ix, iy );
809 if ( iftriangle == 0 )
813 shade_triangle( px[0], py[0], pz[0], px[2], py[2], pz[2], px[0], py[0], zmin );
814 shade_triangle( px[2], py[2], pz[2], px[2], py[2], zmin, px[0], py[0], zmin );
819 for ( iSlow = 0; iSlow < nSlow - 1; iSlow++ )
821 for ( i = 0; i < 2; i++ )
823 ix = ixFast * iFast + ixSlow * ( iSlow + i ) + ixOrigin;
824 iy = iyFast * iFast + iySlow * ( iSlow + i ) + iyOrigin;
825 if ( indexxmin <= ix && ix < indexxmax &&
826 indexymin[ix] <= iy && iy < indexymax[ix] )
830 pz[2 * i] = getz( zp, ix, iy );
838 if ( iftriangle == 0 )
842 shade_triangle( px[0], py[0], pz[0], px[2], py[2], pz[2], px[0], py[0], zmin );
843 shade_triangle( px[2], py[2], pz[2], px[2], py[2], zmin, px[0], py[0], zmin );
885 plfplot3dcl( x, y,
plf2ops_c(), (
PLPointer) z, nx, ny, opt, clevel, nlevel, 0, 0, NULL, NULL );
892 plfplot3dcl( x, y, zops, zp, nx, ny, opt, clevel, nlevel, 0, 0, NULL, NULL );
925 opt, clevel, nlevel, indexxmin, indexxmax, indexymin, indexymax );
973 PLFLT cxx, cxy, cyx, cyy, cyz;
974 PLINT init, ix, iy, color;
977 PLINT ixmin = 0, ixmax = nx - 1, iymin = 0, iymax = ny - 1;
978 PLINT clipped = 0, base_cont = 0, side = 0;
980 PLFLT *_x = NULL, *_y = NULL, **_z = NULL;
981 const PLFLT *x_modified, *y_modified;
986 if ( plsc->level < 3 )
988 myabort(
"plot3dcl: Please set up window first" );
992 if ( ( opt & 3 ) == 0 )
994 myabort(
"plot3dcl: Bad option" );
998 if ( nx <= 0 || ny <= 0 )
1000 myabort(
"plot3dcl: Bad array dimensions." );
1004 plP_gdom( &xmin, &xmax, &ymin, &ymax );
1015 for ( i = 0; i < nx - 1; i++ )
1017 if ( x[i] >= x[i + 1] )
1019 myabort(
"plot3dcl: X array must be strictly increasing" );
1023 for ( i = 0; i < ny - 1; i++ )
1025 if ( y[i] >= y[i + 1] )
1027 myabort(
"plot3dcl: Y array must be strictly increasing" );
1041 if ( xmax > x[nx - 1] )
1045 if ( ymax > y[ny - 1] )
1047 for ( ixmin = 0; ixmin < nx - 1 && x[ixmin + 1] <
xmin; ixmin++ )
1050 for ( ixmax = nx - 1; ixmax > 0 && x[ixmax - 1] >
xmax; ixmax-- )
1053 for ( iymin = 0; iymin < ny - 1 && y[iymin + 1] <
ymin; iymin++ )
1056 for ( iymax = ny - 1; iymax > 0 && y[iymax - 1] >
ymax; iymax-- )
1061 if ( ixmin > 0 || ixmax < nx - 1 || iymin > 0 || iymax < ny - 1 )
1064 int _nx = ixmax - ixmin + 1;
1065 int _ny = iymax - iymin + 1;
1066 PLFLT ty0, ty1, tx0, tx1;
1069 if ( _nx <= 1 || _ny <= 1 )
1071 myabort(
"plot3dcl: selected x or y range has no data" );
1076 if ( ( ( _x = (
PLFLT *) malloc( (
size_t) _nx *
sizeof (
PLFLT ) ) ) == NULL ) ||
1077 ( ( _y = (
PLFLT *) malloc( (
size_t) _ny *
sizeof (
PLFLT ) ) ) == NULL ) ||
1078 ( ( _z = (
PLFLT **) malloc( (
size_t) _nx *
sizeof (
PLFLT* ) ) ) == NULL ) )
1080 plexit(
"c_plot3dcl: Insufficient memory" );
1088 for ( i = 1; i < _nx - 1; i++ )
1089 _x[i] = x[ixmin + i];
1092 for ( i = 1; i < _ny - 1; i++ )
1093 _y[i] = y[iymin + i];
1096 for ( i = 0; i < _nx; i++ )
1098 if ( ( _z[i] = (
PLFLT *) malloc( (
size_t) _ny *
sizeof (
PLFLT ) ) ) == NULL )
1100 plexit(
"c_plot3dcl: Insufficient memory" );
1105 ty0 = ( _y[0] - y[iymin] ) / ( y[iymin + 1] - y[iymin] );
1106 ty1 = ( _y[_ny - 1] - y[iymax - 1] ) / ( y[iymax] - y[iymax - 1] );
1107 tx0 = ( _x[0] - x[ixmin] ) / ( x[ixmin + 1] - x[ixmin] );
1108 tx1 = ( _x[_nx - 1] - x[ixmax - 1] ) / ( x[ixmax] - x[ixmax - 1] );
1109 for ( i = 0; i < _nx; i++ )
1113 _z[i][0] = getz( zp, ixmin, iymin ) * ( 1 - ty0 ) * ( 1 - tx0 ) + getz( zp, ixmin, iymin + 1 ) * ( 1 - tx0 ) * ty0
1114 + getz( zp, ixmin + 1, iymin ) * tx0 * ( 1 - ty0 ) + getz( zp, ixmin + 1, iymin + 1 ) * tx0 * ty0;
1115 for ( j = 1; j < _ny - 1; j++ )
1116 _z[i][j] = getz( zp, ixmin, iymin + j ) * ( 1 - tx0 ) + getz( zp, ixmin + 1, iymin + j ) * tx0;
1117 _z[i][_ny - 1] = getz( zp, ixmin, iymax - 1 ) * ( 1 - tx0 ) * ( 1 - ty1 ) + getz( zp, ixmin, iymax ) * ( 1 - tx0 ) * ty1
1118 + getz( zp, ixmin + 1, iymax - 1 ) * tx0 * ( 1 - ty1 ) + getz( zp, ixmin + 1, iymax ) * tx0 * ty1;
1120 else if ( i == _nx - 1 )
1122 _z[i][0] = getz( zp, ixmax - 1, iymin ) * ( 1 - tx1 ) * ( 1 - ty0 ) + getz( zp, ixmax - 1, iymin + 1 ) * ( 1 - tx1 ) * ty0
1123 + getz( zp, ixmax, iymin ) * tx1 * ( 1 - ty0 ) + getz( zp, ixmax, iymin + 1 ) * tx1 * ty0;
1124 for ( j = 1; j < _ny - 1; j++ )
1125 _z[i][j] = getz( zp, ixmax - 1, iymin + j ) * ( 1 - tx1 ) + getz( zp, ixmax, iymin + j ) * tx1;
1126 _z[i][_ny - 1] = getz( zp, ixmax - 1, iymax - 1 ) * ( 1 - tx1 ) * ( 1 - ty1 ) + getz( zp, ixmax, iymax ) * ( 1 - tx1 ) * ty1
1127 + getz( zp, ixmax, iymax - 1 ) * tx1 * ( 1 - ty1 ) + getz( zp, ixmax, iymax ) * tx1 * ty1;
1131 _z[i][0] = getz( zp, ixmin + i, iymin ) * ( 1 - ty0 ) + getz( zp, ixmin + i, iymin + 1 ) * ty0;
1132 for ( j = 1; j < _ny - 1; j++ )
1133 _z[i][j] = getz( zp, ixmin + i, iymin + j );
1134 _z[i][_ny - 1] = getz( zp, ixmin + i, iymax - 1 ) * ( 1 - ty1 ) + getz( zp, ixmin + i, iymax ) * ty1;
1136 for ( j = 0; j < _ny; j++ )
1138 if ( _z[i][j] < zmin )
1140 else if ( _z[i][j] > zmax )
1150 x_modified = (
const PLFLT *) _x;
1151 y_modified = (
const PLFLT *) _y;
1175 plwarn(
"plot3dcl: Maximum and minimum Z values are equal! \"fixing\"..." );
1180 if ( opt & BASE_CONT )
1182 if ( clevel != NULL && nlevel != 0 )
1191 if ( opt & MAG_COLOR )
1193 if ( (
ctmp = (
PLFLT *) malloc( (
size_t) ( 2 *
MAX( nx, ny ) ) *
sizeof (
PLFLT ) ) ) == NULL )
1195 plexit(
"c_plot3dcl: Insufficient memory" );
1206 utmp = (PLINT *) malloc( (
size_t) ( 2 *
MAX( nx, ny ) ) *
sizeof ( PLINT ) );
1207 vtmp = (PLINT *) malloc( (
size_t) ( 2 *
MAX( nx, ny ) ) *
sizeof ( PLINT ) );
1210 myexit(
"plot3dcl: Out of memory." );
1212 plP_gw3wc( &cxx, &cxy, &cyx, &cyy, &cyz );
1216 if ( cxx >= 0.0 && cxy <= 0.0 )
1219 plt3zz( 1, ny, 1, -1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1222 for ( iy = 2; iy <= ny; iy++ )
1223 plt3zz( 1, iy, 1, -1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1226 plt3zz( 1, ny, 1, -1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1229 for ( ix = 1; ix <= nx - 1; ix++ )
1230 plt3zz( ix, ny, 1, -1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1234 else if ( cxx <= 0.0 && cxy <= 0.0 )
1237 plt3zz( nx, ny, -1, -1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1240 for ( ix = 2; ix <= nx; ix++ )
1241 plt3zz( ix, ny, -1, -1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1244 plt3zz( nx, ny, -1, -1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1247 for ( iy = ny; iy >= 2; iy-- )
1248 plt3zz( nx, iy, -1, -1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1252 else if ( cxx <= 0.0 && cxy >= 0.0 )
1255 plt3zz( nx, 1, -1, 1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1258 for ( iy = ny - 1; iy >= 1; iy-- )
1259 plt3zz( nx, iy, -1, 1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1262 plt3zz( nx, 1, -1, 1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1265 for ( ix = nx; ix >= 2; ix-- )
1266 plt3zz( ix, 1, -1, 1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1270 else if ( cxx >= 0.0 && cxy >= 0.0 )
1273 plt3zz( 1, 1, 1, 1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1276 for ( ix = nx - 1; ix >= 1; ix-- )
1277 plt3zz( ix, 1, 1, 1, opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1280 plt3zz( 1, 1, 1, 1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1283 for ( iy = 1; iy <= ny - 1; iy++ )
1284 plt3zz( 1, iy, 1, 1, -opt, &init, x_modified, y_modified, zops, zp, nx, ny,
utmp,
vtmp,
ctmp );
1296 PLINT *uu = (PLINT *) malloc( (
size_t)
NPTS *
sizeof (
PLINT ) );
1297 PLINT *vv = (PLINT *) malloc( (
size_t)
NPTS *
sizeof (
PLINT ) );
1302 if ( ( uu == NULL ) || ( vv == NULL ) )
1304 plexit(
"c_plot3dcl: Insufficient memory" );
1313 for ( i = 0; i < nx; i++ )
1315 for ( j = 0; j < ny; j++ )
1317 cgrid2.
xg[i][j] = x_modified[i];
1318 cgrid2.
yg[i][j] = y_modified[j];
1319 zstore[i][j] = getz( zp, i, j );
1327 clevel, nlevel,
pltr2, (
void *) &cgrid2, &cont );
1341 int cx, k, l, m, start, end;
1343 if ( cline->
npts > np )
1346 if ( ( ( uu = (PLINT *) realloc( uu, (
size_t) np *
sizeof ( PLINT ) ) ) == NULL ) ||
1347 ( ( vv = (PLINT *) realloc( vv, (
size_t) np *
sizeof ( PLINT ) ) ) == NULL ) )
1349 plexit(
"c_plot3dcl: Insufficient memory" );
1357 if ( cline->
npts > 0 )
1363 for ( j = i; j < cline->
npts; j++ )
1372 plnxtv( &uu[i], &vv[i], NULL, j - i, 0 );
1374 if ( j < cline->npts )
1377 for ( i = start; i < cline->
npts; i++ )
1387 for ( k = 0; k < ( end - start + 1 ) / 2; k++ )
1393 cline->
x[l] = cline->
x[m];
1394 cline->
y[l] = cline->
y[m];
1400 for ( j = start; j <= end; j++ )
1405 plnxtv( &uu[start], &vv[start], NULL, end - start + 1, 0 );
1407 cline->
x[end] = cline->
x[start];
1408 cline->
y[end] = cline->
y[start];
1411 }
while ( j < cline->npts && i < cline->npts );
1413 cline = cline->
next;
1415 while ( cline != NULL );
1418 while ( clev != NULL );
1429 plside3( x_modified, y_modified, zops, zp, nx, ny, opt );
1433 color = plsc->icol0;
1434 width = plsc->width;
1448 for ( i = 0; i < nx; i++ )
1568 PLFLT vx1, vx2, vy1, vy2, vz1, vz2;
1570 PLFLT vlx, vly, vlz;
1582 px = vy1 * vz2 - vz1 * vy2;
1583 py = vz1 * vx2 - vx1 * vz2;
1584 pz = vx1 * vy2 - vy1 * vx2;
1585 mag1 = px * px + py * py + pz * pz;
1594 mag2 = vlx * vlx + vly * vly + vlz * vlz;
1599 cosangle = fabs( ( vlx * px + vly * py + vlz * pz ) / sqrt( mag1 * mag2 ) );
1628 while ( 1 <= x0 && x0 <= nx && 1 <= y0 && y0 <= ny )
1630 x2d =
plP_w3wcx( x[x0 - 1], y[y0 - 1], getz( zp, x0 - 1, y0 - 1 ) );
1631 y2d =
plP_w3wcy( x[x0 - 1], y[y0 - 1], getz( zp, x0 - 1, y0 - 1 ) );
1665 if ( flag == 1 || flag == -2 )
1672 else if ( flag == -2 )
1677 if ( 1 <= x0 && x0 <= nx && 1 <= y0 && y0 <= ny )
1679 x2d =
plP_w3wcx( x[x0 - 1], y[y0 - 1], getz( zp, x0 - 1, y0 - 1 ) );
1680 y2d =
plP_w3wcy( x[x0 - 1], y[y0 - 1], getz( zp, x0 - 1, y0 - 1 ) );
1691 plnxtv( u, v, c, n, *init );
1706 PLFLT cxx, cxy, cyx, cyy, cyz;
1708 PLFLT tx, ty, ux, uy;
1711 plP_gw3wc( &cxx, &cxy, &cyx, &cyy, &cyz );
1712 plP_gdom( &xmin, &xmax, &ymin, &ymax );
1717 if ( cxx >= 0.0 && cxy <= 0.0 )
1721 for ( i = 0; i < nx; i++ )
1725 ux =
plP_w3wcx( x[i], y[0], getz( zp, i, 0 ) );
1726 uy =
plP_w3wcy( x[i], y[0], getz( zp, i, 0 ) );
1727 pljoin( tx, ty, ux, uy );
1732 for ( i = 0; i < ny; i++ )
1736 ux =
plP_w3wcx( x[0], y[i], getz( zp, 0, i ) );
1737 uy =
plP_w3wcy( x[0], y[i], getz( zp, 0, i ) );
1738 pljoin( tx, ty, ux, uy );
1742 else if ( cxx <= 0.0 && cxy <= 0.0 )
1746 for ( i = 0; i < nx; i++ )
1748 tx =
plP_w3wcx( x[i], y[ny - 1], zmin );
1749 ty =
plP_w3wcy( x[i], y[ny - 1], zmin );
1750 ux =
plP_w3wcx( x[i], y[ny - 1], getz( zp, i, ny - 1 ) );
1751 uy =
plP_w3wcy( x[i], y[ny - 1], getz( zp, i, ny - 1 ) );
1752 pljoin( tx, ty, ux, uy );
1757 for ( i = 0; i < ny; i++ )
1761 ux =
plP_w3wcx( x[0], y[i], getz( zp, 0, i ) );
1762 uy =
plP_w3wcy( x[0], y[i], getz( zp, 0, i ) );
1763 pljoin( tx, ty, ux, uy );
1767 else if ( cxx <= 0.0 && cxy >= 0.0 )
1771 for ( i = 0; i < nx; i++ )
1773 tx =
plP_w3wcx( x[i], y[ny - 1], zmin );
1774 ty =
plP_w3wcy( x[i], y[ny - 1], zmin );
1775 ux =
plP_w3wcx( x[i], y[ny - 1], getz( zp, i, ny - 1 ) );
1776 uy =
plP_w3wcy( x[i], y[ny - 1], getz( zp, i, ny - 1 ) );
1777 pljoin( tx, ty, ux, uy );
1782 for ( i = 0; i < ny; i++ )
1784 tx =
plP_w3wcx( x[nx - 1], y[i], zmin );
1785 ty =
plP_w3wcy( x[nx - 1], y[i], zmin );
1786 ux =
plP_w3wcx( x[nx - 1], y[i], getz( zp, nx - 1, i ) );
1787 uy =
plP_w3wcy( x[nx - 1], y[i], getz( zp, nx - 1, i ) );
1788 pljoin( tx, ty, ux, uy );
1792 else if ( cxx >= 0.0 && cxy >= 0.0 )
1796 for ( i = 0; i < nx; i++ )
1800 ux =
plP_w3wcx( x[i], y[0], getz( zp, i, 0 ) );
1801 uy =
plP_w3wcy( x[i], y[0], getz( zp, i, 0 ) );
1802 pljoin( tx, ty, ux, uy );
1807 for ( i = 0; i < ny; i++ )
1809 tx =
plP_w3wcx( x[nx - 1], y[i], zmin );
1810 ty =
plP_w3wcy( x[nx - 1], y[i], zmin );
1811 ux =
plP_w3wcx( x[nx - 1], y[i], getz( zp, nx - 1, i ) );
1812 uy =
plP_w3wcy( x[nx - 1], y[i], getz( zp, nx - 1, i ) );
1813 pljoin( tx, ty, ux, uy );
1830 PLFLT cxx, cxy, cyx, cyy, cyz, zmin_in, zmax_in;
1835 plP_gw3wc( &cxx, &cxy, &cyx, &cyy, &cyz );
1836 plP_gdom( &xmin, &xmax, &ymin, &ymax );
1838 zmin = ( zmax_in > zmin_in ) ? zmin_in : zmax_in;
1839 zmax = ( zmax_in > zmin_in ) ? zmax_in : zmin_in;
1842 tp = tick * floor( zmin / tick ) + tick;
1845 if ( cxx >= 0.0 && cxy <= 0.0 )
1847 while ( tp <= zmax )
1865 else if ( cxx <= 0.0 && cxy <= 0.0 )
1867 while ( tp <= zmax )
1885 else if ( cxx <= 0.0 && cxy >= 0.0 )
1887 while ( tp <= zmax )
1905 else if ( cxx >= 0.0 && cxy >= 0.0 )
1907 while ( tp <= zmax )
1970 myexit(
"plnxtvhi: Out of memory." );
1975 for ( i = 1; i < n; i++ )
2014 myexit(
"plnxtvhi: Out of memory." );
2035 PLINT i = 0, j = 0, first = 1;
2036 PLINT sx1 = 0, sx2 = 0, sy1 = 0, sy2 = 0;
2037 PLINT su1, su2, sv1, sv2;
2038 PLINT cx, cy, px, py;
2039 PLINT seg, ptold, lstold = 0, pthi, pnewhi = 0, newhi, change, ochange = 0;
2052 while ( i <
mhi || j < n )
2063 ptold = ( j >= n || ( i <
mhi &&
oldhiview[2 * i] < u[j] ) );
2068 seg = j > 0 && j < n;
2081 seg = i > 0 && i <
mhi;
2098 pthi =
plabv( px, py, sx1, sy1, sx2, sy2 );
2102 newhi = ( ptold && !pthi ) || ( !ptold && pthi );
2107 change = ( newhi && !pnewhi ) || ( !newhi && pnewhi );
2128 if (
pl3upv == 0 && ( ( !ptold && j == 0 ) || ( ptold && i == 0 ) ) )
2136 ( ( !ptold && i >=
mhi ) || ( ptold && j >= n ) ) )
2157 else if ( i >=
mhi )
2196 pl3cut( sx1, sy1, sx2, sy2, su1, sv1, su2, sv2, &cx, &cy );
2197 if ( cx == px && cy == py )
2199 if ( lstold && !ochange )
2210 if ( lstold && !ochange )
2226 if ( lstold && ptold )
2273 PLINT sx1 = 0, sx2 = 0, sy1 = 0, sy2 = 0;
2274 PLINT su1, su2, sv1, sv2;
2275 PLINT cx, cy, px, py;
2276 PLINT seg, ptold, lstold = 0, ptlo, pnewlo, newlo, change, ochange = 0;
2289 myexit(
"\nplnxtvlo: Out of memory." );
2294 for ( i = 1; i < n; i++ )
2335 myexit(
"plnxtvlo: Out of memory." );
2342 while ( i <
mlo || j < n )
2352 ptold = ( j >= n || ( i <
mlo &&
oldloview[2 * i] < u[j] ) );
2357 seg = j > 0 && j < n;
2370 seg = i > 0 && i <
mlo;
2387 ptlo = !
plabv( px, py, sx1, sy1, sx2, sy2 );
2391 newlo = ( ptold && !ptlo ) || ( !ptold && ptlo );
2392 change = ( newlo && !pnewlo ) || ( !newlo && pnewlo );
2413 if (
pl3upv == 0 && ( ( !ptold && j == 0 ) || ( ptold && i == 0 ) ) )
2421 ( ( !ptold && i >=
mlo ) || ( ptold && j >= n ) ) )
2443 else if ( i >=
mlo )
2482 pl3cut( sx1, sy1, sx2, sy2, su1, sv1, su2, sv2, &cx, &cy );
2483 if ( cx == px && cy == py )
2485 if ( lstold && !ochange )
2496 if ( lstold && !ochange )
2512 if ( lstold && ptold )
2555 myexit(
"savehipoint: Out of memory." );
2576 myexit(
"savelopoint: Out of memory." );
2678 if ( py >= sy1 && py >= sy2 )
2680 else if ( py < sy1 && py < sy2 )
2682 else if ( (
double) ( sx2 - sx1 ) * ( py - sy1 ) >=
2683 (
double) ( px - sx1 ) * ( sy2 - sy1 ) )
2702 PLINT x21, y21, u21, v21, yv1, xu1, a, b;
2712 a = x21 * v21 - y21 * u21;
2730 b = yv1 * u21 - xu1 * v21;
2732 *cx = (
PLINT) ( sx1 + ( fb * x21 ) / fa + .5 );
2733 *cy = (
PLINT) ( sy1 + ( fb * y21 ) / fa + .5 );
2768 *stride = sqrt( xFormMatrix[0] * xFormMatrix[0] + xFormMatrix[2] * xFormMatrix[2] );
2771 *rotation = atan2( xFormMatrix[2], xFormMatrix[0] );
2774 smr = atan2( xFormMatrix[1], xFormMatrix[3] );
2777 *shear = smr + *rotation;
2782 else if ( *shear >
PI )