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