perm filename CLIPER.FAI[CAR,BGB] blob sn#001259 filedate 1972-11-21 generic text, type T, neo UTF8
00100	TITLE CLIPER  -  2D LINE SEGMENT CLIPPER  -  AUGUST 1972.
00200	
00300		DECLARE{XL,XH,YL,YH}
00400	;CLIPIN(XL,XH,YL,YH)
00500	SUBR(CLIPIN)
00600	BEGIN CLIPIN
00700		LAC ARG1↔DAC YH
00800		LAC ARG2↔DAC YL
00900		LAC ARG3↔DAC XH
01000		LAC ARG4↔DAC XL
01100		RET4
01200	BEND
     

00100	; FLG ← CLIP(X1,Y1,X2,Y2) RETURN TRUE WHEN PORTION IS VISIBLE.
00102		DECLARE{A,B,C,FLGO,FLGZ,AXH,AXL,BYH,BYL,QNE,QNW,QSW,QSE}
00200	SUBR(CLIP)
00300	BEGIN CLIP
00400		ACCUMULATORS{X1,Y1,X2,Y2,PDL}
00500		PTR←13
00700	
00800	;PICK 'EM UP;
00900		LAC X1,@ARG4↔LAC Y1,@ARG3
01000		LAC X2,@ARG2↔LAC Y2,@ARG1
01100		LIMZ PTR,PDL-1
01200	
01300	;SET NSEW BITS.
01400		SETZB 1
01500		CAMLE Y1,YH↔TRO 8↔CAMLE Y2,YH↔TRO 1,8;	NORTH.
01600		CAMGE Y1,YL↔TRO 4↔CAMGE Y2,YL↔TRO 1,4;	SOUTH.
01700		CAMLE X1,XH↔TRO 2↔CAMLE X2,XH↔TRO 1,2;	EAST.
01800		CAMGE X1,XL↔TRO 1↔CAMGE X2,XL↔TRO 1,1;	WEST.
01900	
02000	;EASY OUTSIDER EDGE.
02100		TRNE 0,(1)↔GO [OUTSIDE: SETZ 1,↔RET4]
02200	
02300	;EASY INSIDER VERTICES.
02400		JUMPE 0,[PUSH PTR,X1↔PUSH PTR,Y1↔GO .+1]
02500		JUMPE 1,[PUSH PTR,X2↔PUSH PTR,Y2↔GO .+1]
02600		DEFINE DONE{CAMN PTR,[XWD 4,PDL+3]↔GO L}
02700		DONE
     

00100	;COMPUTE EDGE COEFFICIENTS.
00200		LAC Y1↔FSBR Y2↔DAC A
00300		LAC X2↔FSBR X1↔DAC B
00400		LAC X2↔FMPR Y1↔MOVNM C
00500		LAC X1↔FMPR Y2↔FADRM C
00600	
00700	;PARTIAL PRODUCTS.
00800		LAC A↔FMPR XH↔DAC AXH
00900		LAC A↔FMPR XL↔DAC AXL
01000		LAC B↔FMPR YH↔DAC BYH
01100		LAC B↔FMPR YL↔DAC BYL
01200	
01300	;CORNER Q'S.
01400		SETOM FLGO↔SETZM FLGZ
01500		LAC AXH↔FADR BYH↔FADR C↔DAC QNE↔ANDM FLGO↔IORM FLGZ
01600		LAC AXL↔FADR BYH↔FADR C↔DAC QNW↔ANDM FLGO↔IORM FLGZ
01700		LAC AXL↔FADR BYL↔FADR C↔DAC QSW↔ANDM FLGO↔IORM FLGZ
01800		LAC AXH↔FADR BYL↔FADR C↔DAC QSE↔ANDM FLGO↔IORM FLGZ
01900	
02000	;HARD OUTSIDER CASES.
02100		SKIPGE FLGO↔GO OUTSIDE
02200		SKIPL  FLGZ↔GO OUTSIDE
     

00100	;XY-CLIPPER continued.
00200	;NORTH BORDER CROSSING.
00300		LAC QNE↔XOR QNW↔SKIPL↔GO L2
00400		LAC Y1↔CAMGE Y2↔LAC Y2↔CAMG YH↔GO L2
00500		LAC BYH↔FADR C↔MOVNS↔FDVR A↔PUSH PTR,
00600		LAC YH↔PUSH PTR,
00700		DONE
00800	
00900	;SOUTH BORDER CROSSING.
01000	L2:	LAC QSE↔XOR QSW↔SKIPL↔GO L3
01100		LAC Y1↔CAMLE Y2↔LAC Y2↔CAML YL↔GO L3
01200		LAC BYL↔FADR C↔MOVNS↔FDVR A↔PUSH PTR,
01300		LAC YL↔PUSH PTR,
01400		DONE
01500	
01600	;EAST BORDER CROSSING.
01700	L3:	LAC QSE↔XOR QNE↔SKIPL↔GO L4
01800		LAC X1↔CAMGE X2↔LAC X2↔CAMG XH↔GO L4
01900		LAC XH↔PUSH PTR,
02000		LAC AXH↔FADR C↔MOVNS↔FDVR B↔PUSH PTR,
02100		DONE
02200	
02300	;WEST BORDER CROSSING.
02400	L4:	LAC QSW↔XOR QNW↔SKIPL↔GO L5
02500		LAC X1↔CAMLE X2↔LAC X2↔CAML XL↔GO L5
02600		LAC XL↔PUSH PTR,
02700		LAC AXL↔FADR C↔MOVNS↔FDVR B↔PUSH PTR,
02800		DONE
02900	
03000	;STRANGE EXIT - NSEW BIT MARKING & EDGE COEF ARE INCONSISTENT.
03100	L5:	OUTSTR[ASCIZ/2D CLIPPER FALL THRU !
03200	/]↔	GO OUTSIDER
03300	
03400	;VISIBLE PORTION EXIT.
03500	L:	DAC X1+4,@ARG4↔DAC Y1+4,@ARG3
03600		DAC X2+4,@ARG2↔DAC Y2+4,@ARG1
03700		SETO 1,↔RET4
03800		LIT
03900	BEND
04000	END