ANGL

Aus C64-Wiki
Wechseln zu: Navigation, Suche
ANGL
Format: ANGL <x>,<y>,<w>,<rx>,<ry>,<f>
Parameter
x: X-Koordinate Mittelpunkt (0..319 / 0..159)
y: Y-Koordinate Mittelpunkt (0..199)
w: Winkel in Altgrad (0..359)
rx: Radius in X-Richtung (0..255)
ry: Radius in Y-Richtung (0..255)
f: Farbquelle (0..2 / 0..4)
Einordnung
Typ: Anweisung
Kontext: Grafik
Aufgabe: Zeichnen des Radius von Ellipsen (u. Kreisen)
Abkürzung: keine
Verwandte Befehle
LINE - REC - BLOCK - PLOT - ARC - CIRCLE - PAINT


Dieser Artikel beschreibt das Simons'-Basic-Schlüsselwort ANGL.

Typ: Anweisung 
Syntax: ANGL <x>,<y>,<w>,<rx>,<ry>,<f>

Wenn CIRCLE für Ellipsen und Kreise zuständig ist, freut man sich über den Befehl ANGL zum Zeichnen von Radiuslinien in diesen Figuren.

Sie gehen aus vom Mittelpunkt (<x>,<y>) einer Ellipse (bzw. eines Kreises), verlaufen in der Richtung <w> (mit Winkelangaben in Altgrad) und reichen bis zur (imaginären) Ellipsen- bzw. Kreislinie mit den Radien <rx> und <ry> in der Farbe, die durch <f> bestimmt wird (s. dazu HIRES). In x-Richtung dürfen Ellipsen 255 Punkte Radius aufweisen, in y-Richtung ebenfalls.

Punkte, die über den Bildschirmrand hinausgehen würden, werden auf diese höchstmöglichen Koordinaten begrenzt, der Interpreter malt aber weiter. Die Farbe hängt vom Grafikmodus ab und bezieht sich auf die Farbangaben hinter HIRES einerseits bzw. MULTI und LOW COL andererseits. Der Punkt 0,0 ist in der linken oberen Ecke.

Beachten: Zu große Angaben bei <w> werden nicht abgewiesen, aber dennoch falsch berechnet. Wenn für <w> Werte angegeben werden, die über 360 Grad hinausgehen, ergibt sich intern Folgendes: w = 360 + (360 - w), für ein <w> von 370 errechnet der Interpreter also den Wert 350.

Mit ANGL kann man gut Uhrzeiger malen

Wird kein Parameter eingegeben, so erscheint die Fehlermeldung ?SYNTAX ERROR, bei einem falschen Wert erscheint ?ILLEGAL QUANTITY ERROR.

Beispiel (bitte zuerst die Systemvariable TIME$ bzw. TI$ stellen): 

100 HIRES 0,1: mx=160: my=100: h=0: m=0: s=0
110 CIRCLE mx,my,90,90,1: CIRCLE mx,my,85,85,1: PAINT mx+87,my,1
115 FOR w=0 TO 359 STEP 30: ANGL mx,my,w,90,90,0: NEXT
120 REPEAT: GET x$
130 t$=ti$: hh=VAL(LEFT$(t$,2))*30: mm=VAL(MID$(t$,3,2))*6: ss=VAL(RIGHT$(t$,2))*6
131 IF hh>=360 THEN hh=hh-360
133 mh=DIV(mm,12): hh=hh+mh: hf=hh<>h: mf=mm<>m: sf=ss<>s
140 zz$=LEFT$(t$,2)+":"+MID$(t$,3,2)+":"+RIGHT$(t$,2)
145 IF t$=ti$ THEN TEXT 250,190,zz$,1,1,8
150 IF sf THEN ANGL mx,my,s,83,83,0: ANGL mx,my,ss,83,83,1: s=ss: mf=(s-6)=m
155 RCOMP hf=((s-12)<=h) AND (s>=h)
160 IF mf THEN ANGL mx,my,m,70,70,0: ANGL mx,my,mm,70,70,1: m=mm
165 RCOMP hf=((m-12)<=h) AND (m>=h)
170 IF hf  THEN ANGL mx,my,h,45,45,0: ANGL mx,my,hh,45,45,1: h=hh
220 IF t$<>ti$ THEN BLOCK 250,190,250+8*8,190+8,0
230 UNTIL x$>""

(erzeugt die abgebildete Animation)

(Kommentar: hf, mf und sf (Zeile 133) sind Flags, die dafür sorgen, dass ein Zeiger, der gerade
überholt wird, nicht für die nächste Runde verschwindet (da der überholende Zeiger ihn löscht).
Probleme machte dabei der Stundenzeiger, der sich ja im Laufe der Stunde auch bewegt, allerdings
anders als der Minuten- und Sekundenzeiger. Daher die Bereichsabfragen hinter RCOMP. Ich hätte
den Stundenzeiger auch alle 12 Minuten vorrücken können, aber dies hier ist "echter". Zweimal
am Tag verschwindet der Stundenzeiger dennoch: um 2 Minuten vor 12 für 3 Minuten, eben wegen
Zeilen 155 und 165.)