540 void ( *draw )(
short *,
short *,
PLINT ) )
542#ifdef USE_FILL_INTERSECTION_POLYGON
543 PLINT *x10, *y10, *x1, *y1, *if1, i1start = 0, i, im1, n1, n1m1,
545 PLINT x2[4] = { xmin, xmax, xmax, xmin };
546 PLINT y2[4] = { ymin, ymin, ymax, ymax };
547 PLINT if2[4] = { 0, 0, 0, 0 };
551 if ( npts < 3 || !draw )
554 if ( ( x10 = (
PLINT *) malloc( (
size_t) npts *
sizeof (
PLINT ) ) ) == NULL )
556 plexit(
"plP_plfclp: Insufficient memory" );
558 if ( ( y10 = (
PLINT *) malloc( (
size_t) npts *
sizeof (
PLINT ) ) ) == NULL )
560 plexit(
"plP_plfclp: Insufficient memory" );
568 for ( i = 0; i < npts; i++ )
570 if ( !(
x[i] ==
x[im1] &&
y[i] ==
y[im1] ) )
591 if ( positive_orientation( n1, x10, y10 ) )
598 if ( ( x1 = (
PLINT *) malloc( (
size_t) n1 *
sizeof (
PLINT ) ) ) == NULL )
600 plexit(
"plP_plfclp: Insufficient memory" );
602 if ( ( y1 = (
PLINT *) malloc( (
size_t) n1 *
sizeof (
PLINT ) ) ) == NULL )
604 plexit(
"plP_plfclp: Insufficient memory" );
607 for ( i = 0; i < n1; i++ )
609 x1[n1m1 - i] = x10[i];
610 y1[n1m1 - i] = y10[i];
620 for ( i = 0; i < n1; i++ )
622 if ( ( ifnotpointinpolygon =
628 if ( ifnotpointinpolygon )
629 fill_intersection_polygon( 0, 0, 0, draw, x1, y1, i1start, n1, x2, y2, if2, n2 );
632 if ( ( if1 = (
PLINT *) calloc( n1,
sizeof (
PLINT ) ) ) == NULL )
634 plexit(
"plP_plfclp: Insufficient memory" );
636 fill_intersection_polygon( 0, 0, 0, draw, x2, y2, i1start, n2, x1, y1, if1, n1 );
645 PLINT i, x1, x2, y1, y2;
646 int iclp = 0, iout = 2;
648 short *xclp = NULL, *yclp = NULL;
650 int crossed_xmin1 = 0, crossed_xmax1 = 0;
651 int crossed_ymin1 = 0, crossed_ymax1 = 0;
652 int crossed_xmin2 = 0, crossed_xmax2 = 0;
653 int crossed_ymin2 = 0, crossed_ymax2 = 0;
654 int crossed_up = 0, crossed_down = 0;
655 int crossed_left = 0, crossed_right = 0;
662 if ( npts < 3 || !draw )
672 if ( ( ( xclp = (
short *) malloc( (
size_t) ( 2 * npts + 2 ) *
sizeof (
short ) ) ) == NULL ) ||
673 ( ( yclp = (
short *) malloc( (
size_t) ( 2 * npts + 2 ) *
sizeof (
short ) ) ) == NULL ) )
675 plexit(
"plP_plfclp: Insufficient memory" );
683 for ( i = 0; i < npts - 1; i++ )
685 x1 =
x[i]; x2 =
x[i + 1];
686 y1 =
y[i]; y2 =
y[i + 1];
691 xmin, xmax, ymin, ymax );
696 crossed_xmin2 = ( x1 == xmin ); crossed_xmax2 = ( x1 == xmax );
697 crossed_ymin2 = ( y1 == ymin ); crossed_ymax2 = ( y1 == ymax );
699 crossed_left = ( crossed_left || crossed_xmin2 );
700 crossed_right = ( crossed_right || crossed_xmax2 );
701 crossed_down = ( crossed_down || crossed_ymin2 );
702 crossed_up = ( crossed_up || crossed_ymax2 );
708 xclp[iclp] = (short) x1; yclp[iclp] = (short) y1; iclp++;
709 xclp[iclp] = (short) x2; yclp[iclp] = (short) y2; iclp++;
715 else if ( x1 == (
int) xclp[iclp - 1] && y1 == (
int) yclp[iclp - 1] )
717 xclp[iclp] = (short) x2; yclp[iclp] = (short) y2; iclp++;
731 xclp[iclp + 1] = (short) x2; yclp[iclp + 1] = (short) y2;
732 xclp[iclp + 2] = (short) x1; yclp[iclp + 2] = (short) y1;
733 iout = iout - iclp + 1;
735 if ( ( ( crossed_xmin1 && crossed_xmax2 ) ||
736 ( crossed_xmin2 && crossed_xmax1 ) ) &&
741 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
742 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
746 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
747 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
751 else if ( ( ( crossed_xmin1 && crossed_xmax2 ) ||
752 ( crossed_xmin2 && crossed_xmax1 ) ) &&
757 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
758 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
762 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
763 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
767 else if ( ( ( crossed_ymin1 && crossed_ymax2 ) ||
768 ( crossed_ymin2 && crossed_ymax1 ) ) &&
773 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
774 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
778 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
779 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
783 else if ( ( ( crossed_ymin1 && crossed_ymax2 ) ||
784 ( crossed_ymin2 && crossed_ymax1 ) ) &&
789 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
790 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
794 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
795 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
800 else if ( ( crossed_xmin1 && crossed_ymin2 ) ||
801 ( crossed_ymin1 && crossed_xmin2 ) )
803 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
806 else if ( ( crossed_xmax1 && crossed_ymin2 ) ||
807 ( crossed_ymin1 && crossed_xmax2 ) )
809 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
812 else if ( ( crossed_xmin1 && crossed_ymax2 ) ||
813 ( crossed_ymax1 && crossed_xmin2 ) )
815 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
818 else if ( ( crossed_xmax1 && crossed_ymax2 ) ||
819 ( crossed_ymax1 && crossed_xmax2 ) )
821 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
825 xclp[iclp] = (short) x1; yclp[iclp] = (short) y1; iclp++;
826 xclp[iclp] = (short) x2; yclp[iclp] = (short) y2; iclp++;
830 crossed_xmin1 = ( x2 == xmin ); crossed_xmax1 = ( x2 == xmax );
831 crossed_ymin1 = ( y2 == ymin ); crossed_ymax1 = ( y2 == ymax );
842 xclp[0] = (short) xmin; yclp[0] = (short) ymin;
843 xclp[1] = (short) xmax; yclp[1] = (short) ymin;
844 xclp[2] = (short) xmax; yclp[2] = (short) ymax;
845 xclp[3] = (short) xmin; yclp[3] = (short) ymax;
846 xclp[4] = (short) xmin; yclp[4] = (short) ymin;
847 ( *draw )( xclp, yclp, 5 );
867 if ( ( xclp[0] == (
short) xmin && xclp[iclp - 1] == (
short) xmax ) ||
868 ( xclp[0] == (
short) xmax && xclp[iclp - 1] == (
short) xmin ) ||
869 ( yclp[0] == (
short) ymin && yclp[iclp - 1] == (
short) ymax ) ||
870 ( yclp[0] == (
short) ymax && yclp[iclp - 1] == (
short) ymin ) ||
871 ( xclp[0] == (
short) xmin && yclp[iclp - 1] == (
short) ymin ) ||
872 ( yclp[0] == (
short) ymin && xclp[iclp - 1] == (
short) xmin ) ||
873 ( xclp[0] == (
short) xmax && yclp[iclp - 1] == (
short) ymin ) ||
874 ( yclp[0] == (
short) ymin && xclp[iclp - 1] == (
short) xmax ) ||
875 ( xclp[0] == (
short) xmax && yclp[iclp - 1] == (
short) ymax ) ||
876 ( yclp[0] == (
short) ymax && xclp[iclp - 1] == (
short) xmax ) ||
877 ( xclp[0] == (
short) xmin && yclp[iclp - 1] == (
short) ymax ) ||
878 ( yclp[0] == (
short) ymax && xclp[iclp - 1] == (
short) xmin ) )
880 printf(
"dir=%d, clipped points:\n", dir );
881 for ( i = 0; i < iclp; i++ )
882 printf(
" x[%d]=%hd y[%d]=%hd", i, xclp[i], i, yclp[i] );
884 printf(
"pre-clipped points:\n" );
885 for ( i = 0; i < npts; i++ )
886 printf(
" x[%d]=%d y[%d]=%d", i,
x[i], i,
y[i] );
893 if ( xclp[0] == (
short) xmin && xclp[iclp - 1] == (
short) xmax )
897 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
898 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
902 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
903 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
906 else if ( xclp[0] == (
short) xmax && xclp[iclp - 1] == (
short) xmin )
910 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
911 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
915 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
916 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
921 else if ( yclp[0] == (
short) ymin && yclp[iclp - 1] == (
short) ymax )
925 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
926 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
930 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
931 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
934 else if ( yclp[0] == (
short) ymax && yclp[iclp - 1] == (
short) ymin )
938 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
939 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
943 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
944 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
960 else if ( ( xclp[0] == (
short) xmin && yclp[iclp - 1] == (
short) ymin && dir < 0 ) ||
961 ( yclp[0] == (
short) ymin && xclp[iclp - 1] == (
short) xmin && dir > 0 ) )
963 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
966 else if ( ( xclp[0] == (
short) xmin && yclp[iclp - 1] == (
short) ymin && dir > 0 ) )
968 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
969 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
970 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
973 else if ( ( yclp[0] == ymin && xclp[iclp - 1] == xmin && dir < 0 ) )
975 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
976 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
977 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
980 else if ( ( xclp[0] == (
short) xmax && yclp[iclp - 1] == (
short) ymin && dir > 0 ) ||
981 ( yclp[0] == (
short) ymin && xclp[iclp - 1] == (
short) xmax && dir < 0 ) )
983 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
986 else if ( yclp[0] == (
short) ymin && xclp[iclp - 1] == (
short) xmax && dir > 0 )
988 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
989 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
990 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
993 else if ( xclp[0] == (
short) xmax && yclp[iclp - 1] == (
short) ymin && dir < 0 )
995 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
996 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
997 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
1000 else if ( ( xclp[0] == (
short) xmax && yclp[iclp - 1] == (
short) ymax && dir < 0 ) ||
1001 ( yclp[0] == (
short) ymax && xclp[iclp - 1] == (
short) xmax && dir > 0 ) )
1003 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
1006 else if ( xclp[0] == (
short) xmax && yclp[iclp - 1] == (
short) ymax && dir > 0 )
1008 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
1009 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
1010 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
1013 else if ( yclp[0] == (
short) ymax && xclp[iclp - 1] == (
short) xmax && dir < 0 )
1015 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
1016 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
1017 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
1020 else if ( ( xclp[0] == (
short) xmin && yclp[iclp - 1] == (
short) ymax && dir > 0 ) ||
1021 ( yclp[0] == (
short) ymax && xclp[iclp - 1] == (
short) xmin && dir < 0 ) )
1023 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymax; iclp++;
1026 else if ( yclp[0] == (
short) ymax && xclp[iclp - 1] == (
short) xmin && dir > 0 )
1028 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
1029 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
1030 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
1033 else if ( xclp[0] == (
short) xmin && yclp[iclp - 1] == (
short) ymax && dir < 0 )
1035 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymax; iclp++;
1036 xclp[iclp] = (short) xmax; yclp[iclp] = (short) ymin; iclp++;
1037 xclp[iclp] = (short) xmin; yclp[iclp] = (short) ymin; iclp++;
1046 if ( inside_lb + inside_rb + inside_lu + inside_ru == 4 )
1049 PLINT xlim[4], ylim[4];
1053 xlim[0] = xmin; ylim[0] = ymin;
1054 xlim[1] = xmax; ylim[1] = ymin;
1055 xlim[2] = xmax; ylim[2] = ymax;
1056 xlim[3] = xmin; ylim[3] = ymax;
1058 if ( crossed_left + crossed_right + crossed_down + crossed_up == 1 )
1063 insert = 0 * crossed_left + 1 * crossed_down + 2 * crossed_right +
1069 insert = 3 * crossed_left + 2 * crossed_up + 1 * crossed_right +
1074 if ( crossed_left + crossed_right == 2 && crossed_down + crossed_up == 0 )
1076 if ( xclp[iclp - 1] == xmin )
1104 if ( crossed_left + crossed_right == 0 && crossed_down + crossed_up == 2 )
1106 if ( yclp[iclp - 1] == ymin )
1134 for ( i = 0; i < 4; i++ )
1136 xclp[iclp] = (short) xlim[insert];
1137 yclp[iclp] = (short) ylim[insert];
1149 ( *draw )( xclp, yclp, iclp );
1151 if ( xclp != _xclp )