27 #define INSIDE( ix, iy ) ( BETW( ix, xmin, xmax ) && BETW( iy, ymin, ymax ) )
79 if ( plsc->level < 3 )
81 plabort(
"plline: Please set up window first" );
100 if ( plsc->coordinate_transform == NULL )
111 if ( xs == NULL || ys == NULL )
113 plexit(
"c_plpath: Insufficient memory" );
136 PLFLT vmin[3], vmax[3], zscale;
138 if ( plsc->level < 3 )
140 plabort(
"plline3: Please set up window first" );
145 plP_gdom( &vmin[0], &vmax[0], &vmin[1], &vmax[1] );
149 for ( i = 0; i < n - 1; i++ )
155 p0[0] = x[i]; p0[1] = y[i]; p0[2] = z[i];
156 p1[0] = x[i + 1]; p1[1] = y[i + 1]; p1[2] = z[i + 1];
159 for ( axis = 0; axis < 3; axis++ )
161 if ( p0[axis] < vmin[axis] )
163 if ( p1[axis] < vmin[axis] )
171 PLFLT t = ( vmin[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
172 p0[axis] = vmin[axis];
173 for ( j = 1; j < 3; j++ )
175 int k = ( axis + j ) % 3;
176 p0[k] = ( 1 - t ) * p0[k] + t * p1[k];
180 else if ( p1[axis] < vmin[axis] )
184 PLFLT t = ( vmin[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
185 p1[axis] = vmin[axis];
186 for ( j = 1; j < 3; j++ )
188 int k = ( axis + j ) % 3;
189 p1[k] = ( 1 - t ) * p0[k] + t * p1[k];
192 if ( p0[axis] > vmax[axis] )
194 if ( p1[axis] > vmax[axis] )
202 PLFLT t = ( vmax[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
203 p0[axis] = vmax[axis];
204 for ( j = 1; j < 3; j++ )
206 int k = ( axis + j ) % 3;
207 p0[k] = ( 1 - t ) * p0[k] + t * p1[k];
211 else if ( p1[axis] > vmax[axis] )
215 PLFLT t = ( vmax[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
216 p1[axis] = vmax[axis];
217 for ( j = 1; j < 3; j++ )
219 int k = ( axis + j ) % 3;
220 p1[k] = ( 1 - t ) * p0[k] + t * p1[k];
228 PLFLT u0, v0, u1, v1;
271 PLFLT vmin[3], vmax[3], zscale;
272 PLFLT u1, v1, u2, v2, u3, v3;
275 if ( plsc->level < 3 )
277 plabort(
"plpoly3: Please set up window first" );
283 plabort(
"plpoly3: Must specify at least 3 points" );
298 c = ( u1 - u2 ) * ( v3 - v2 ) - ( v1 - v2 ) * ( u3 - u2 );
300 if ( c * ( 1 - 2 *
ABS( ifcc ) ) < 0. )
304 plP_gdom( &vmin[0], &vmax[0], &vmin[1], &vmax[1] );
308 for ( i = 0; i < n - 1; i++ )
314 p0[0] = x[i]; p0[1] = y[i]; p0[2] = z[i];
315 p1[0] = x[i + 1]; p1[1] = y[i + 1]; p1[2] = z[i + 1];
318 for ( axis = 0; axis < 3; axis++ )
320 if ( p0[axis] < vmin[axis] )
322 if ( p1[axis] < vmin[axis] )
330 PLFLT t = ( vmin[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
331 p0[axis] = vmin[axis];
332 for ( j = 1; j < 3; j++ )
334 int k = ( axis + j ) % 3;
335 p0[k] = ( 1 - t ) * p0[k] + t * p1[k];
339 else if ( p1[axis] < vmin[axis] )
343 PLFLT t = ( vmin[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
344 p1[axis] = vmin[axis];
345 for ( j = 1; j < 3; j++ )
347 int k = ( axis + j ) % 3;
348 p1[k] = ( 1 - t ) * p0[k] + t * p1[k];
351 if ( p0[axis] > vmax[axis] )
353 if ( p1[axis] > vmax[axis] )
361 PLFLT t = ( vmax[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
362 p0[axis] = vmax[axis];
363 for ( j = 1; j < 3; j++ )
365 int k = ( axis + j ) % 3;
366 p0[k] = ( 1 - t ) * p0[k] + t * p1[k];
370 else if ( p1[axis] > vmax[axis] )
374 PLFLT t = ( vmax[axis] - p0[axis] ) / ( p1[axis] - p0[axis] );
375 p1[axis] = vmax[axis];
376 for ( j = 1; j < 3; j++ )
378 int k = ( axis + j ) % 3;
379 p1[k] = ( 1 - t ) * p0[k] + t * p1[k];
385 if ( axis == 3 && draw[i] )
411 if ( plsc->level < 1 )
413 plabort(
"plstyl: Please call plinit first" );
416 if ( ( nms < 0 ) || ( nms > 10 ) )
418 plabort(
"plstyl: Broken lines cannot have <0 or >10 elements" );
422 for ( i = 0; i < nms; i++ )
424 if ( ( mark[i] < 0 ) || ( space[i] < 0 ) )
426 plabort(
"plstyl: Mark and space lengths must be > 0" );
429 if ( ( mark[i] != 0 ) || ( space[i] != 0 ) )
435 if ( ( nms > 0 ) && ( flag == 1 ) )
437 plabort(
"plstyl: At least one mark or space must be > 0" );
442 for ( i = 0; i < nms; i++ )
444 plsc->mark[i] = mark[i];
445 plsc->space[i] = space[i];
451 plsc->alarm = nms > 0 ? mark[0] : 0;
476 xline[0] = plsc->currx;
478 yline[0] = plsc->curry;
512 xline[0] = plsc->currx;
514 yline[0] = plsc->curry;
531 PLINT i, j, ib, ilim;
537 for ( i = 0; i < ilim; i++ )
558 PLINT i, j, ib, ilim;
565 for ( i = 0; i < ilim; i++ )
586 plP_pllclp( x, y, npts, plsc->clpxmi, plsc->clpxma,
587 plsc->clpymi, plsc->clpyma,
genlin );
603 void ( *draw )(
short *,
short *,
PLINT ) )
605 PLINT x1, x2, y1, y2;
609 short *xclp = NULL, *yclp = NULL;
619 if ( ( ( xclp = (
short *) malloc( (
size_t) npts *
sizeof (
short ) ) ) == NULL ) ||
620 ( ( yclp = (
short *) malloc( (
size_t) npts *
sizeof (
short ) ) ) == NULL ) )
622 plexit(
"plP_pllclp: Insufficient memory" );
626 for ( i = 0; i < npts - 1; i++ )
636 xmin, xmax, ymin, ymax );
644 xclp[iclp] = (short) x1;
645 yclp[iclp] = (short) y1;
647 xclp[iclp] = (short) x2;
648 yclp[iclp] = (short) y2;
654 else if ( x1 == xclp[iclp] && y1 == yclp[iclp] )
657 xclp[iclp] = (short) x2;
658 yclp[iclp] = (short) y2;
666 ( *draw )( xclp, yclp, iclp + 1 );
668 xclp[iclp] = (short) x1;
669 yclp[iclp] = (short) y1;
671 xclp[iclp] = (short) x2;
672 yclp[iclp] = (short) y2;
680 ( *draw )( xclp, yclp, iclp + 1 );
682 plsc->currx = x[npts - 1];
683 plsc->curry = y[npts - 1];
703 double dydx = 0, dxdy = 0;
708 if ( ( *p_x1 <= xmin && *p_x2 <= xmin ) ||
709 ( *p_x1 >= xmax && *p_x2 >= xmax ) ||
710 ( *p_y1 <= ymin && *p_y2 <= ymin ) ||
711 ( *p_y1 >= ymax && *p_y2 >= ymax ) )
724 *p_x1 = 2 * xmin - *p_x1;
725 *p_x2 = 2 * xmin - *p_x2;
726 xmax = 2 * xmin -
xmax;
735 *p_y1 = 2 * ymin - *p_y1;
736 *p_y2 = 2 * ymin - *p_y2;
737 ymax = 2 * ymin -
ymax;
747 if ( dx != 0 && dy != 0 )
749 dydx = (double) dy / (
double)
dx;
755 if ( dx != 0 && dy != 0 )
756 *p_y1 = *p_y1 +
ROUND( ( xmin - *p_x1 ) * dydx );
762 if ( dx != 0 && dy != 0 )
763 *p_x1 = *p_x1 +
ROUND( ( ymin - *p_y1 ) * dxdy );
767 if ( *p_x1 >= xmax || *p_y1 >= ymax )
772 if ( dx != 0 && dy != 0 )
773 *p_x2 = *p_x2 -
ROUND( ( *p_y2 - ymax ) * dxdy );
779 if ( dx != 0 && dy != 0 )
780 *p_y2 = *p_y2 -
ROUND( ( *p_x2 - xmax ) * dydx );
786 *p_x1 = 2 * xmax - *p_x1;
787 *p_x2 = 2 * xmax - *p_x2;
792 *p_y1 = 2 * ymax - *p_y1;
793 *p_y2 = 2 * ymax - *p_y2;
812 if ( plsc->nms == 0 )
829 if ( plsc->dev_dash )
831 plsc->dev_npts = npts;
838 for ( i = 0; i < npts - 1; i++ )
856 PLINT tstep, pix_distance, j;
859 double nxstep, nystep;
868 plsc->alarm = plsc->mark[0];
874 if ( x[0] == x[1] && y[0] == y[1] )
878 dx = ( nx > 0 ) ? 1 : -1;
882 dy = ( ny > 0 ) ? 1 : -1;
902 nxstep = nxp * plsc->umx;
903 nystep = nyp * plsc->umy;
904 tstep = (
PLINT) ( sqrt( nxstep * nxstep + nystep * nystep ) / modulo );
913 pix_distance = ( plsc->alarm - plsc->timecnt + tstep - 1 ) / tstep;
916 pix_distance -= ( i - modulo );
917 plsc->timecnt += pix_distance * tstep;
919 temp += pix_distance * incr;
921 temp = temp % modulo;
925 xtmp += pix_distance *
dx;
931 ytmp += pix_distance *
dy;
933 if ( plsc->pendn != 0 )
935 xl[0] = (short)
lastx;
936 yl[0] = (short)
lasty;
937 xl[1] = (short) xtmp;
938 yl[1] = (short) ytmp;
944 while ( plsc->timecnt >= plsc->alarm )
946 if ( plsc->pendn != 0 )
949 plsc->timecnt -= plsc->alarm;
950 plsc->alarm = plsc->space[plsc->curel];
955 plsc->timecnt -= plsc->alarm;
957 if ( plsc->curel >= plsc->nms )
959 plsc->alarm = plsc->mark[plsc->curel];
985 if ( ( values = (
PLFLT *) malloc( (
size_t) n *
sizeof (
PLFLT ) ) ) == NULL )
990 step_size = ( b -
a ) / (
PLFLT) ( n - 1 );
991 for ( i = 0; i < n; i++ )
993 values[i] = a + step_size * (
PLFLT) i;