' Linien, Kreise und Kreisbogen mit beliebiger Dicke ' Gleitkommakoordinaten (Kommastellen werden beruecksichtigt) SCREEN 1,640,512,4,4 WINDOW 2,,,0,1 FOR i%=0 TO 15 READ r%,g%,b% PALETTE i%,CSNG(r%)/16!,CSNG(g%)/16!,CSNG(b%)/16! NEXT i% DATA 0, 0, 0,12, 3, 0, 9, 6, 0, 6, 9, 0 DATA 3,12, 0, 0,15, 0, 0,12, 3, 0, 9, 6 DATA 0, 6, 9, 0, 3,12, 0, 0,15, 3, 0,12 DATA 6, 0, 9, 9, 0, 6,12, 0, 3,15, 0, 0 DIM SHARED Pi! Pi!=4!*ATN(1!) FOR f%=1 TO 15 w1!=CSNG(f%)*Pi!/7.5 ZeichneDickeLinie 9!,316!+30!*COS(w1!),254!-30!*SIN(w1!),316!+170!*COS(w1!),254!-170!*SIN(w1!),f% ZeichneDickerKreisbogen 9!,316!+205!*COS(w1!),254!-205!*SIN(w1!),35!,w1!,w1!+Pi!,f% ZeichneDickerKreis 9!,316!+205!*COS(w1!),254!-205!*SIN(w1!),17.5,f% ZeichneDickerPunkt 9!,316!+205!*COS(w1!),254!-205!*SIN(w1!),f% NEXT f% WHILE MOUSE(0)>-1 WEND WINDOW CLOSE 2 SCREEN CLOSE 1 SUB ZeichneDickeLinie (d!,xh1!,yh1!,xh2!,yh2!,f%) STATIC COLOR f% IF yh2!>yh1! THEN x1!=xh1! y1!=yh1! x2!=xh2! y2!=yh2! ELSE x1!=xh2! y1!=yh2! x2!=xh1! y2!=yh1! END IF r!=d!/2! r2!=r!*r! dx1!=x2!-x1! dy1!=y2!-y1! l!=SQR(dx1!*dx1!+dy1!*dy1!) dy!=r!*dx1!/l! IF dy1! THEN P!=dx1!/dy1! x!=x1!-y1!*P! dx!=r!*l!/dy1! x3!=x!+dx! x4!=x!-dx! END IF yp1%=CINT(INT(y1!-dy!)) yp2%=CINT(INT(y1!+dy!)) yp3%=CINT(INT(y2!-dy!)) yp4%=CINT(INT(y2!+dy!)) FOR y%=CINT(INT(y1!-r!))+1 TO CINT(INT(y2!+r!)) IF y%>yp4% THEN h!=CSNG(y%)-y2! x1%=CINT(INT(x2!-SQR(r2!-h!*h!))) ELSEIF y%>yp2% THEN x1%=CINT(INT(x4!+CSNG(y%)*P!)) ELSE h!=CSNG(y%)-y1! x1%=CINT(INT(x1!-SQR(r2!-h!*h!))) END IF IF y%>yp3% THEN h!=CSNG(y%)-y2! x2%=CINT(INT(x2!+SQR(r2!-h!*h!))) ELSEIF y%>yp1% THEN x2%=CINT(INT(x3!+CSNG(y%)*P!)) ELSE h!=CSNG(y%)-y1! x2%=CINT(INT(x1!+SQR(r2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% END SUB SUB ZeichneDickerKreis (d!,x!,y!,r!,f%) STATIC COLOR f% ra!=r!+d!/2! ra2!=ra!*ra! ri!=r!-d!/2! ri2!=ri!*ri! qoi%=CINT(INT(y!-ri!)) qui%=CINT(INT(y!+ri!)) FOR y%=CINT(INT(y!-ra!))+1 TO CINT(INT(y!+ra!)) h!=CSNG(y%)-y! t!=SQR(ra2!-h!*h!) x1%=CINT(INT(x!-t!)) IF y%>qoi% AND y%<=qui% THEN t2!=SQR(ri2!-h!*h!) x2%=CINT(INT(x!-t2!)) IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF x1%=CINT(INT(x!+t2!)) END IF x2%=CINT(INT(x!+t!)) IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% END SUB SUB ZeichneDickerKreisbogen (d!,x!,y!,r!,sw!,ew!,f%) STATIC COLOR f% s1!=sw!-2!*Pi!*INT(sw!/2!/Pi!) e1!=ew!-2!*Pi!*INT(ew!/2!/Pi!) d1!=d!/2! ra!=r!+d1! ri!=r!-d1! d2!=d1!*d1! ra2!=ra!*ra! ri2!=ri!*ri! xs!=x!+r!*COS(sw!) ys!=y!-r!*SIN(sw!) ysa%=CINT(INT(y!-ra!*SIN(sw!))) xe!=x!+r!*COS(ew!) ye!=y!-r!*SIN(ew!) yea%=CINT(INT(y!-ra!*SIN(ew!))) IF e1!>s1! THEN qo%=s1!Pi!/2! qu%=s1!<1.5*Pi! AND e1!>1.5*Pi! ELSE qo%=s1!Pi!/2! qu%=s1!<1.5*Pi! OR e1!>1.5*Pi! END IF ls%=s1!>=Pi!/2! AND s1!Pi!/2! AND e1!<=Pi!*1.5 IF ls% THEN y1%=CINT(INT(ys!-d1!)) ELSE y1%=CINT(INT(ys!+d1!)) END IF IF le% THEN y2%=CINT(INT(ye!+d1!)) ELSE y2%=CINT(INT(ye!-d1!)) END IF IF r!>d1! THEN ysi%=CINT(INT(y!-ri!*SIN(sw!))) yei%=CINT(INT(y!-ri!*SIN(ew!))) IF qo% THEN qoi%=CINT(INT(y!-ri!)) END IF IF qu% THEN qui%=CINT(INT(y!+ri!)) END IF ELSE dx!=(xe!-xs!)/2! dy!=(ye!-ys!)/2! a2!=dx!*dx!+dy!*dy! ysi%=CINT(INT((ys!+ye!)/2!-dx!*SQR(d2!-a2!)/SQR(a2!))) yei%=ysi% qoi%=ysi% qui%=ysi% END IF IF qo% AND qu% AND ls% AND le% THEN GOSUB SchwanzUntenLinks GOSUB KuppeUnten GOSUB MondRechts GOSUB KuppeOben GOSUB SchwanzObenLinks ELSEIF qo% AND qu% AND NOT ls% AND NOT le% THEN GOSUB SchwanzObenRechts GOSUB KuppeOben GOSUB MondLinks GOSUB KuppeUnten GOSUB SchwanzUntenRechts ELSEIF qo% AND NOT qu% AND NOT ls% AND le% THEN GOSUB SchwanzObenRechts GOSUB KuppeOben GOSUB SchwanzObenLinks ELSEIF NOT qo% AND qu% AND ls% AND NOT le% THEN GOSUB SchwanzUntenLinks GOSUB KuppeUnten GOSUB SchwanzUntenRechts ELSEIF NOT qo% AND NOT qu% AND ls% AND le% THEN GOSUB BananeLinks ELSE GOSUB BananeRechts END IF EXIT SUB KuppeOben: FOR y%=CINT(INT(y!-ra!))+1 TO qoi% IF y%>yea% AND le% THEN h!=CSNG(y%)-ye! x1%=CINT(INT(xe!-SQR(d2!-h!*h!))) ELSE h!=CSNG(y%)-y! x1%=CINT(INT(x!-SQR(ra2!-h!*h!))) END IF IF y%>ysa% AND NOT ls% THEN h!=CSNG(y%)-ys! x2%=CINT(INT(xs!+SQR(d2!-h!*h!))) ELSE h!=CSNG(y%)-y! x2%=CINT(INT(x!+SQR(ra2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN KuppeUnten: FOR y%=qui%+1 TO CINT(INT(y!+ra!)) IF y%>ysa% OR NOT ls% THEN h!=CSNG(y%)-y! x1%=CINT(INT(x!-SQR(ra2!-h!*h!))) ELSE h!=CSNG(y%)-ys! x1%=CINT(INT(xs!-SQR(d2!-h!*h!))) END IF IF y%>yea% OR le% THEN h!=CSNG(y%)-y! x2%=CINT(INT(x!+SQR(ra2!-h!*h!))) ELSE h!=CSNG(y%)-ye! x2%=CINT(INT(xe!+SQR(d2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN SchwanzObenRechts: FOR y%=qoi%+1 TO y1% IF y%>ysi% THEN h!=CSNG(y%)-ys! x1%=CINT(INT(xs!-SQR(d2!-h!*h!))) ELSE h!=CSNG(y%)-y! x1%=CINT(INT(x!+SQR(ri2!-h!*h!))) END IF IF y%>ysa% THEN h!=CSNG(y%)-ys! x2%=CINT(INT(xs!+SQR(d2!-h!*h!))) ELSE h!=CSNG(y%)-y! x2%=CINT(INT(x!+SQR(ra2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN SchwanzObenLinks: FOR y%=qoi%+1 TO y2% IF y%>yea% THEN h!=CSNG(y%)-ye! x1%=CINT(INT(xe!-SQR(d2!-h!*h!))) ELSE h!=CSNG(y%)-y! x1%=CINT(INT(x!-SQR(ra2!-h!*h!))) END IF IF y%>yei% THEN h!=CSNG(y%)-ye! x2%=CINT(INT(xe!+SQR(d2!-h!*h!))) ELSE h!=CSNG(y%)-y! x2%=CINT(INT(x!-SQR(ri2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN SchwanzUntenLinks: FOR y%=y1%+1 TO qui% IF y%>ysa% THEN h!=CSNG(y%)-y! x1%=CINT(INT(x!-SQR(ra2!-h!*h!))) ELSE h!=CSNG(y%)-ys! x1%=CINT(INT(xs!-SQR(d2!-h!*h!))) END IF IF y%>ysi% THEN h!=CSNG(y%)-y! x2%=CINT(INT(x!-SQR(ri2!-h!*h!))) ELSE h!=CSNG(y%)-ys! x2%=CINT(INT(xs!+SQR(d2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN SchwanzUntenRechts: FOR y%=y2%+1 TO qui% IF y%>yei% THEN h!=CSNG(y%)-y! x1%=CINT(INT(x!+SQR(ri2!-h!*h!))) ELSE h!=CSNG(y%)-ye! x1%=CINT(INT(xe!-SQR(d2!-h!*h!))) END IF IF y%>yea% THEN h!=CSNG(y%)-y! x2%=CINT(INT(x!+SQR(ra2!-h!*h!))) ELSE h!=CSNG(y%)-ye! x2%=CINT(INT(xe!+SQR(d2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN MondRechts: FOR y%=qoi%+1 TO qui% h!=CSNG(y%)-y! x1%=CINT(INT(x!+SQR(ri2!-h!*h!))) x2%=CINT(INT(x!+SQR(ra2!-h!*h!))) IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN MondLinks: FOR y%=qoi%+1 TO qui% h!=CSNG(y%)-y! x1%=CINT(INT(x!-SQR(ra2!-h!*h!))) x2%=CINT(INT(x!-SQR(ri2!-h!*h!))) IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN BananeRechts: FOR y%=y2%+1 TO y1% IF y%>ysi% THEN h!=CSNG(y%)-ys! x1%=CINT(INT(xs!-SQR(d2!-h!*h!))) ELSEIF y%>yei% THEN h!=CSNG(y%)-y! x1%=CINT(INT(x!+SQR(ri2!-h!*h!))) ELSE h!=CSNG(y%)-ye! x1%=CINT(INT(xe!-SQR(d2!-h!*h!))) END IF IF y%>ysa% THEN h!=CSNG(y%)-ys! x2%=CINT(INT(xs!+SQR(d2!-h!*h!))) ELSEIF y%>yea% THEN h!=CSNG(y%)-y! x2%=CINT(INT(x!+SQR(ra2!-h!*h!))) ELSE h!=CSNG(y%)-ye! x2%=CINT(INT(xe!+SQR(d2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN BananeLinks: FOR y%=y1%+1 TO y2% IF y%>yea% THEN h!=CSNG(y%)-ye! x1%=CINT(INT(xe!-SQR(d2!-h!*h!))) ELSEIF y%>ysa% THEN h!=CSNG(y%)-y! x1%=CINT(INT(x!-SQR(ra2!-h!*h!))) ELSE h!=CSNG(y%)-ys! x1%=CINT(INT(xs!-SQR(d2!-h!*h!))) END IF IF y%>yei% THEN h!=CSNG(y%)-ye! x2%=CINT(INT(xe!+SQR(d2!-h!*h!))) ELSEIF y%>ysi% THEN h!=CSNG(y%)-y! x2%=CINT(INT(x!-SQR(ri2!-h!*h!))) ELSE h!=CSNG(y%)-ys! x2%=CINT(INT(xs!+SQR(d2!-h!*h!))) END IF IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% RETURN END SUB SUB ZeichneDickerPunkt (d!,x!,y!,f%) STATIC COLOR f% r!=d!/2! r2!=r!*r! FOR y%=CINT(INT(y!-r!))+1 TO CINT(INT(y!+r!)) h!=CSNG(y%)-y! t!=SQR(r2!-h!*h!) x1%=CINT(INT(x!-t!)) x2%=CINT(INT(x!+t!)) IF x2%>x1% THEN LINE (x1%+1,y%)-(x2%,y%) END IF NEXT y% END SUB