ANGL

Aus C64-Wiki
Zur Navigation springenZur Suche springen
ANGL
Syntax: 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 (TSB: aN)
Token: $64 $6a (100 106)
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.


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

Beispiel[Bearbeiten | Quelltext bearbeiten]

Vorher 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$>""
Mit ANGL kann man gut Uhrzeiger malen

Das Programm 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. Eine Variante wäre den Stundenzeiger auch alle 12 Minuten vorrücken lassen zu können, aber diese 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.