' PICK-Grundroutinen : Unterprogramme, die berpruefen, ob ein Punkt oder ' Segment (Linie, Kreis oder Kreisbogen) sich innerhalb eines Rechteckes be- ' findet oder jenes sogar schneidet (wird fr die Objektidentifikation be- ' n”tigt) ' Test als Mausprogramm ' $INCLUDE: 'qb.bi' DECLARE SUB ZeichneXORRechteck (x1%, y1%, x2%, y2%) DECLARE SUB PickFensPun (xe1!, ye1!, xe2!, ye2!, x!, y!, g%) DECLARE SUB PickInliegLin (xe1!, ye1!, xe2!, ye2!, x1!, y1!, x2!, y2!, g%) DECLARE SUB PickSchneidLin (xe1!, ye1!, xe2!, ye2!, x1!, y1!, x2!, y2!, g%) DECLARE SUB PickInliegBog (xe1!, ye1!, xe2!, ye2!, x!, y!, r!, sw!, ew!, g%) DECLARE SUB PickSchneidBog (xe1!, ye1!, xe2!, ye2!, x!, y!, r!, sw!, ew!, g%) DIM SHARED Pi! DIM SHARED lin%(961), dosIntEin AS RegTypeX, dosIntAus AS RegTypeX FOR i% = 2 TO 961 lin%(i%) = -1 NEXT i% Pi! = 4! * ATN(1!) RANDOMIZE TIMER ap1% = 19 al1% = 19 ak1% = 19 ab1% = 19 DIM px!(ap1%), py!(ap1%), sp%(ap1%) DIM lx1!(al1%), ly1!(al1%), lx2!(al1%), ly2!(al1%), sl%(al1%) DIM kx!(ak1%), ky!(ak1%), kr!(ak1%), sk%(ak1%) DIM bx!(ab1%), by!(ab1%), br!(ab1%), bs!(ab1%), be!(ab1%), sb%(ab1%) Pi! = 4! * ATN(1!) FOR i% = 0 TO ap1% px!(i%) = 2! + 634! * RND py!(i%) = -20! - 455! * RND NEXT i% FOR i% = 0 TO al1% lx1!(i%) = 2! + 634! * RND ly1!(i%) = -20! - 455! * RND lx2!(i%) = 2! + 634! * RND ly2!(i%) = -20! - 455! * RND NEXT i% FOR i% = 0 TO ak1% kx!(i%) = 2! + 634! * RND ky!(i%) = -20! - 455! * RND rm! = kx!(i%) - 2! rm1! = -ky!(i%) - 20!: IF rm1! < rm! THEN rm! = rm1! rm1! = 636! - kx!(i%): IF rm1! < rm! THEN rm! = rm1! rm1! = 475! + ky!(i%): IF rm1! < rm! THEN rm! = rm1! kr!(i%) = rm! * CSNG(RND) NEXT i% FOR i% = 0 TO ab1% bx!(i%) = 2! + 634! * RND by!(i%) = -20! - 455! * RND rm! = bx!(i%) - 2! rm1! = -by!(i%) - 20!: IF rm1! < rm! THEN rm! = rm1! rm1! = 636! - bx!(i%): IF rm1! < rm! THEN rm! = rm1! rm1! = 475! + by!(i%): IF rm1! < rm! THEN rm! = rm1! br!(i%) = rm! * CSNG(RND) bs!(i%) = 2! * Pi! * CSNG(RND) be!(i%) = 2! * Pi! * CSNG(RND) NEXT i% SCREEN 12 dosIntEin.ax = 0 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) IF dosIntAus.ax <> &HFFFF THEN PRINT "Keine Maus vorhanden!" END END IF ' Cursor sonst unsichtbar lassen WHILE INKEY$ = "" LOCATE 1, 65: PRINT "Zeichne " z% = 0 FOR i% = 0 TO ap1% LINE (px!(i%) - 3!, -py!(i%))-STEP(6, 0), 3 - 8 * sp%(i%), BF LINE STEP(-3, -3)-STEP(0, 6), 3 - 8 * sp%(i%), BF IF sp%(i%) THEN z% = z% + 1 END IF NEXT i% FOR i% = 0 TO al1% LINE (lx1!(i%), -ly1!(i%))-(lx2!(i%), -ly2!(i%)), 4 - 8 * sl%(i%) IF sl%(i%) THEN z% = z% + 1 END IF NEXT i% FOR i% = 0 TO ak1% CIRCLE (kx!(i%), -ky!(i%)), kr!(i%), 5 - 8 * sk%(i%), , , 1! IF sk%(i%) THEN z% = z% + 1 END IF NEXT i% FOR i% = 0 TO ab1% CIRCLE (bx!(i%), -by!(i%)), br!(i%), 2 - 8 * sb%(i%), bs!(i%), be!(i%), 1! IF sb%(i%) THEN z% = z% + 1 END IF NEXT i% LOCATE 1, 1 PRINT USING "Total angew„hlte Objekte: ####"; z% LOCATE 1, 65: PRINT "1. Ecke " dosIntEin.ax = 3 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) ax% = dosIntAus.cx ay% = dosIntAus.dx ' CALL SetDrMd&(WINDOW(8),2) ' ax% = MOUSE(1) - 1: ay% = MOUSE(2) bx% = 639 ' WINDOW(2)-1 by% = 479 ' WINDOW(3)-1 ' LINE (0, ay%)-(bx%, ay%), , BF ' LINE (ax%, 0)-(ax%, by%), , BF lin%(0) = 640 lin%(1) = 1 PUT (0, ay%), lin%, XOR lin%(0) = 1 lin%(1) = 480 PUT (ax%, 0), lin%, XOR DO dosIntEin.ax = 3 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) x% = dosIntAus.cx y% = dosIntAus.dx IF x% <> ax% THEN lin%(0) = 1 lin%(1) = 480 PUT (ax%, 0), lin%, XOR PUT (x%, 0), lin%, XOR ax% = x% END IF IF y% <> ay% THEN lin%(0) = 640 lin%(1) = 1 PUT (0, ay%), lin%, XOR PUT (0, y%), lin%, XOR ay% = y% END IF LOOP UNTIL dosIntAus.bx AND 1 lin%(0) = 640 lin%(1) = 1 PUT (0, ay%), lin%, XOR lin%(0) = 1 lin%(1) = 480 PUT (ax%, 0), lin%, XOR x1% = x%: y1% = y% LOCATE 1, 65: PRINT "2. Ecke " ' ax% = MOUSE(1) - 1: ay% = MOUSE(2) ax% = x%: ay% = y% ' LINE (x1%, y1%)-(ax%, ay%), , B ZeichneXORRechteck x%, y%, ax%, ay% DO ' x% = MOUSE(1) - 1: y% = MOUSE(2) dosIntEin.ax = 3 CALL INTERRUPTX(&H33, dosIntEin, dosIntAus) x% = dosIntAus.cx: y% = dosIntAus.dx IF x% <> ax% OR y% <> ay% THEN ' LINE (x1%, y1%)-(ax%, ay%), , B ZeichneXORRechteck x1%, y1%, ax%, ay% ' LINE (x1%, y1%)-(x%, y%), , B ZeichneXORRechteck x1%, y1%, x%, y% ax% = x%: ay% = y% END IF LOOP WHILE dosIntAus.bx AND 1 x2% = ax%: y2% = ay% ' CALL SetDrMd&(WINDOW(8),1) LOCATE 1, 65: PRINT "Rechne " gw% = y2% > y1% IF gw% THEN SWAP y1%, y2% END IF In% = x2% < x1% IF In% THEN SWAP x1%, x2% END IF xe1! = CSNG(x1%) ye1! = CSNG(-y1%) xe2! = CSNG(x2%) ye2! = CSNG(-y2%) FOR i% = 0 TO ap1% IF sp%(i%) <> gw% THEN PickFensPun xe1!, ye1!, xe2!, ye2!, px!(i%), py!(i%), g% IF g% THEN sp%(i%) = gw% END IF END IF NEXT i% FOR i% = 0 TO al1% IF sl%(i%) <> gw% THEN IF In% THEN PickInliegLin xe1!, ye1!, xe2!, ye2!, lx1!(i%), ly1!(i%), lx2!(i%), ly2!(i%), g% ELSE PickSchneidLin xe1!, ye1!, xe2!, ye2!, lx1!(i%), ly1!(i%), lx2!(i%), ly2!(i%), g% END IF IF g% THEN sl%(i%) = gw% END IF END IF NEXT i% FOR i% = 0 TO ak1% IF sk%(i%) <> gw% THEN IF In% THEN PickInliegBog xe1!, ye1!, xe2!, ye2!, kx!(i%), ky!(i%), kr!(i%), -1!, 0!, g% ELSE PickSchneidBog xe1!, ye1!, xe2!, ye2!, kx!(i%), ky!(i%), kr!(i%), -1!, 0!, g% END IF IF g% THEN sk%(i%) = gw% END IF END IF NEXT i% FOR i% = 0 TO ab1% IF sb%(i%) <> gw% THEN IF In% THEN PickInliegBog xe1!, ye1!, xe2!, ye2!, bx!(i%), by!(i%), br!(i%), bs!(i%), be!(i%), g% ELSE PickSchneidBog xe1!, ye1!, xe2!, ye2!, bx!(i%), by!(i%), br!(i%), bs!(i%), be!(i%), g% END IF IF g% THEN sb%(i%) = gw% END IF END IF NEXT i% ' CALL SetDrMd&(WINDOW(8),2) ZeichneXORRechteck x1%, y1%, x2%, y2% ' CALL SetDrMd&(WINDOW(8),1) WEND LOCATE 1, 65: PRINT "Ende " SCREEN 0 WIDTH 80, 25 END DEFDBL A-Z SUB PickFensPun (xe1!, ye1!, xe2!, ye2!, x!, y!, g%) STATIC g% = x! > xe1! AND x! < xe2! AND y! > ye1! AND y! < ye2! END SUB SUB PickInliegBog (xe1!, ye1!, xe2!, ye2!, x!, y!, r!, sw!, ew!, g%) STATIC IF sw! = -1! THEN g% = x! - r! >= xe1! AND x! + r! <= xe2! AND y! - r! >= ye1! AND y! + r! <= ye2! ELSE sx! = x! + r! * COS(sw!) sy! = y! + r! * SIN(sw!) ex! = x! + r! * COS(ew!) ey! = y! + r! * SIN(ew!) IF ex! < sx! THEN SWAP sx!, ex! END IF IF ey! < sy! THEN SWAP sy!, ey! END IF g% = -1 IF sw! > ew! THEN g% = g% AND x! + r! <= xe2! IF sw! < Pi! / 2! OR ew! > Pi! / 2! THEN g% = g% AND y! + r! <= ye2! ELSE g% = g% AND ey! <= ye2! END IF IF sw! < Pi! OR ew! > Pi! THEN g% = g% AND x! - r! >= xe1! ELSE g% = g% AND sx! >= xe1! END IF IF sw! < Pi! * 1.5 OR ew! > Pi! * 1.5 THEN g% = g% AND y! - r! >= ye1! ELSE g% = g% AND sy! >= ye1! END IF ELSE g% = g% AND ex! <= xe2! IF sw! < Pi! / 2! AND ew! > Pi! / 2! THEN g% = g% AND y! + r! <= ye2! ELSE g% = g% AND ey! <= ye2! END IF IF sw! < Pi! AND ew! > Pi! THEN g% = g% AND x! - r! >= xe1! ELSE g% = g% AND sx! >= xe1! END IF IF sw! < Pi! * 1.5 AND ew! > Pi! * 1.5 THEN g% = g% AND y! - r! >= ye1! ELSE g% = g% AND sy! >= ye1! END IF END IF END IF END SUB SUB PickInliegLin (xe1!, ye1!, xe2!, ye2!, x1!, y1!, x2!, y2!, g%) STATIC g% = x1! > xe1! AND x1! < xe2! AND y1! > ye1! AND y1! < ye2! g% = g% AND x2! > xe1! AND x2! < xe2! AND y2! > ye1! AND y2! < ye2! END SUB SUB PickSchneidBog (xe1!, ye1!, xe2!, ye2!, x!, y!, r!, sw!, ew!, g%) STATIC g% = 0 dx1! = xe1! - x! dy1! = ye1! - y! dx2! = x! - xe2! dy2! = y! - ye2! IF dx1! >= r! OR dx2! >= r! OR dy1! >= r! OR dy2! >= r! THEN EXIT SUB sx! = x! + r! * COS(sw!) sy! = y! + r! * SIN(sw!) ex! = x! + r! * COS(ew!) ey! = y! + r! * SIN(ew!) IF sx! >= xe1! AND sx! <= xe2! AND sy! >= ye1! AND sy! <= ye2! OR ex! >= xe1! AND ex! <= xe2! AND ey! >= ye1! AND ey! <= ye2! THEN g% = -1: EXIT SUB r2! = r! * r! Dx12! = dx1! * dx1! Dy12! = dy1! * dy1! Dx22! = dx2! * dx2! Dy22! = dy2! * dy2! a12! = Dx22! + Dy22! a22! = Dx12! + Dy22! a32! = Dx12! + Dy12! a42! = Dx22! + Dy12! w% = (x! < xe1!) - (x! > xe2!) - 3 * ((y! < ye1!) - (y! > ye2!)) k% = (sw! = -1!) IF w% = -4 THEN IF r2! > a22! AND r2! < a42! THEN IF k% THEN g% = -1 ELSE IF r2! > a32! THEN w! = 1.5 * Pi! - ATN(SQR(r2! - Dy12!) / dy1!) ELSE w! = 1.5 * Pi! + ATN(dx1! / SQR(r2! - Dx12!)) END IF GOSUB BogensegmentPruefen END IF END IF ELSEIF w% = -3 THEN IF r2! < a32! THEN IF k% THEN g% = -1 ELSE IF r2! > a22! THEN w! = 1.5 * Pi! + ATN(dx1! / SQR(r2! - Dx12!)) ELSE w! = Pi! + ATN(dy2! / SQR(r2! - Dy22!)) END IF GOSUB BogensegmentPruefen END IF END IF IF NOT g% THEN IF r2! < a42! THEN IF k% THEN g% = -1 ELSE IF r2! > a12! THEN w! = 1.5 * Pi! - ATN(dx2! / SQR(r2! - Dx22!)) ELSE w! = 2! * Pi! - ATN(dy2! / SQR(r2! - Dy22!)) END IF GOSUB BogensegmentPruefen END IF END IF END IF ELSEIF w% = -2 THEN IF r2! > a12! AND r2! < a32! THEN IF k% THEN g% = -1 ELSE IF r2! > a22! THEN w! = Pi! - ATN(SQR(r2! - Dx12!) / dx1!) ELSE w! = Pi! + ATN(dy2! / SQR(r2! - Dy22!)) END IF GOSUB BogensegmentPruefen END IF END IF ELSEIF w% = -1 THEN IF r2! < a42! THEN IF k% THEN g% = -1 ELSE IF r2! > a32! THEN w! = 2! * Pi! + ATN(dy1! / SQR(r2! - Dy12!)) ELSE w! = 1.5 * Pi! + ATN(dx1! / SQR(r2! - Dx12!)) END IF GOSUB BogensegmentPruefen END IF END IF IF NOT g% THEN IF r2! < a12! THEN IF k% THEN g% = -1 ELSE IF r2! > a22! THEN w! = -ATN(dy2! / SQR(r2! - Dy22!)) ELSE w! = Pi! / 2! - ATN(dx1! / SQR(r2! - Dx12!)) END IF GOSUB BogensegmentPruefen END IF END IF END IF ELSEIF w% = 0 THEN IF r2! < a12! THEN IF k% THEN g% = -1 ELSE IF dx2! THEN w! = ATN(dy2! / dx2!) ELSE w! = Pi! / 2! END IF GOSUB BogensegmentPruefen END IF END IF IF NOT g% THEN IF r2! < a22! THEN IF k% THEN g% = -1 ELSE IF dx1! THEN w! = Pi! - ATN(dy2! / dx1!) ELSE w! = Pi! / 2! END IF GOSUB BogensegmentPruefen END IF END IF END IF IF NOT g% THEN IF r2! < a32! THEN IF k% THEN g% = -1 ELSE IF dx1! THEN w! = Pi! + ATN(dy1! / dx1!) ELSE w! = Pi! * 1.5 END IF GOSUB BogensegmentPruefen END IF END IF END IF IF NOT g% THEN IF r2! < a42! THEN IF k% THEN g% = -1 ELSE IF dx2! THEN w! = 2! * Pi! - ATN(dy1! / dx2!) ELSE w! = Pi! * 1.5 END IF GOSUB BogensegmentPruefen END IF END IF END IF ELSEIF w% = 1 THEN IF r2! < a22! THEN IF k% THEN g% = -1 ELSE IF r2! > a12! THEN w! = Pi! + ATN(dy2! / SQR(r2! - Dy22!)) ELSE w! = Pi! / 2! + ATN(dx2! / SQR(r2! - Dx22!)) END IF GOSUB BogensegmentPruefen END IF END IF IF NOT g% THEN IF r2! < a32! THEN IF k% THEN g% = -1 ELSE IF r2! > a42! THEN w! = Pi! - ATN(dy1! / SQR(r2! - Dy12!)) ELSE w! = 1.5 * Pi! - ATN(dx2! / SQR(r2! - Dx22!)) END IF GOSUB BogensegmentPruefen END IF END IF END IF ELSEIF w% = 2 THEN IF r2! > a32! AND r2! < a12! THEN IF k% THEN g% = -1 ELSE IF r2! > a42! THEN w! = -ATN(SQR(r2! - Dx22!) / dx2!) ELSE w! = ATN(dy1! / SQR(r2! - Dy12!)) END IF GOSUB BogensegmentPruefen END IF END IF ELSEIF w% = 3 THEN IF r2! < a12! THEN IF k% THEN g% = -1 ELSE IF r2! > a42! THEN w! = Pi! / 2! + ATN(dx2! / SQR(r2! - Dx22!)) ELSE w! = ATN(dy1! / SQR(r2! - Dy12!)) END IF GOSUB BogensegmentPruefen END IF END IF IF NOT g% THEN IF r2! < a22! THEN IF k% THEN g% = -1 ELSE IF r2! > a32! THEN w! = Pi! / 2! - ATN(dx1! / SQR(r2! - Dx12!)) ELSE w! = Pi! - ATN(dy1! / SQR(r2! - Dy12!)) END IF GOSUB BogensegmentPruefen END IF END IF END IF ELSE IF r2! > a42! AND r2! < a22! THEN IF k% THEN g% = -1 ELSE IF r2! > a12! THEN w! = Pi! / 2! - ATN(SQR(r2! - Dy22!) / dy2!) ELSE w! = Pi! / 2! + ATN(dx2! / SQR(r2! - Dx22!)) END IF GOSUB BogensegmentPruefen END IF END IF END IF EXIT SUB BogensegmentPruefen: IF ew! > sw! THEN g% = w! > sw! AND w! < ew! ELSE g% = w! > sw! OR w! < ew! END IF RETURN END SUB SUB PickSchneidLin (xe1!, ye1!, xe2!, ye2!, x1!, y1!, x2!, y2!, g%) STATIC tx1% = (x1! < xe1!) - (x1! > xe2!) ty1% = (y1! < ye1!) - (y1! > ye2!) tx2% = (x2! < xe1!) - (x2! > xe2!) ty2% = (y2! < ye1!) - (y2! > ye2!) IF tx1% = 0 AND ty1% = 0 OR tx2% = 0 AND ty2% = 0 THEN g% = -1: EXIT SUB IF tx1% = tx2% AND tx1% <> 0 OR ty1% = ty2% AND ty1% <> 0 THEN g% = 0: EXIT SUB IF tx1% = 0 AND tx2% = 0 AND ty1% <> ty2% OR ty1% = 0 AND ty2% = 0 AND tx1% <> tx2% THEN g% = -1: EXIT SUB dx! = x2! - x1! dy! = y2! - y1! IF tx1% = 0 THEN IF ty1% = 1 THEN GOSUB Schpye2 ELSE GOSUB Schpye1 END IF g% = s% = 0 ELSEIF tx2% = 0 THEN IF ty2% = 1 THEN GOSUB Schpye2 ELSE GOSUB Schpye1 END IF g% = s% = 0 ELSEIF ty1% = 0 THEN IF tx1% = 1 THEN GOSUB Schpxe2 ELSE GOSUB Schpxe1 END IF g% = s% = 0 ELSEIF ty2% = 0 THEN IF tx2% = 1 THEN GOSUB Schpxe2 ELSE GOSUB Schpxe1 END IF g% = s% = 0 ELSE GOSUB Schpxe1 IF s% = 0 THEN g% = -1 ELSEIF s% = ty1% XOR tx2% = 1 THEN g% = 0 ELSE IF s% = 1 THEN GOSUB Schpye2 ELSE GOSUB Schpye1 END IF g% = s% = 0 END IF END IF EXIT SUB Schpxe1: s! = (xe1! - x1!) * dy! / dx! + y1! s% = (s! < ye1!) - (s! > ye2!) RETURN Schpxe2: s! = (xe2! - x1!) * dy! / dx! + y1! s% = (s! < ye1!) - (s! > ye2!) RETURN Schpye1: s! = (ye1! - y1!) * dx! / dy! + x1! s% = (s! < xe1!) - (s! > xe2!) RETURN Schpye2: s! = (ye2! - y1!) * dx! / dy! + x1! s% = (s! < xe1!) - (s! > xe2!) RETURN END SUB SUB ZeichneXORRechteck (x1%, y1%, x2%, y2%) IF x2% > x1% THEN x1a% = x1% x2a% = x2% ELSE x1a% = x2% x2a% = x1% END IF IF y2% > y1% THEN y1a% = y1% y2a% = y2% ELSE y1a% = y2% y2a% = y1% END IF IF x2a% - x1a% < 2 OR y2a% - y1a% < 2 THEN lin%(0) = x2a% - x1a% + 1 lin%(1) = y2a% - y1a% + 1 PUT (x1a%, y1a%), lin%, XOR ELSE lin%(0) = x2a% - x1a% + 1 lin%(1) = 1 PUT (x1a%, y1a%), lin%, XOR PUT (x1a%, y2a%), lin%, XOR lin%(0) = 1 lin%(1) = y2a% - y1a% - 1 PUT (x1a%, y1a% + 1), lin%, XOR PUT (x2a%, y1a% + 1), lin%, XOR END IF END SUB