ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
fcircle.c
Go to the documentation of this file.
1/*****************************************************************************
2 * ugBASIC - an isomorphic BASIC language compiler for retrocomputers *
3 *****************************************************************************
4 * Copyright 2021-2026 Marco Spedaletti (asimov@mclink.it)
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *----------------------------------------------------------------------------
18 * Concesso in licenza secondo i termini della Licenza Apache, versione 2.0
19 * (la "Licenza"); è proibito usare questo file se non in conformità alla
20 * Licenza. Una copia della Licenza è disponibile all'indirizzo:
21 *
22 * http://www.apache.org/licenses/LICENSE-2.0
23 *
24 * Se non richiesto dalla legislazione vigente o concordato per iscritto,
25 * il software distribuito nei termini della Licenza è distribuito
26 * "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o
27 * implicite. Consultare la Licenza per il testo specifico che regola le
28 * autorizzazioni e le limitazioni previste dalla medesima.
29 ****************************************************************************/
30
31/****************************************************************************
32 * INCLUDE SECTION
33 ****************************************************************************/
34
35#include "../../ugbc.h"
36
37/****************************************************************************
38 * CODE SECTION
39 ****************************************************************************/
40
50/* <usermanual>
51@keyword FCIRCLE
52
53@english
54
55The ''FCIRCLE'' command in BASIC draws a circle on the screen and fill it. In other words,
56it defines a complete circle based on the coordinates and radius that you specify, and
57it will draw it as it was filled.
58
59This command allows you to draw a circle with starting coordinates in ''(x,y)''
60and radius ''r''. The color is indicated by the parameter ''c''. If the abscissa
61and/or ordinate is omitted, the last graphic position drawn will be used. In
62addition, the color can also be omitted and, if necessary, the last color set with the
63''PEN'' or ''INK'' command will be used.
64
65There is also another additional syntax, that can be used
66to draw ellipses: you can give both the radii ''rx'' and ''ry'' in the color determined
67by ''fq'' (see ''HIRES'').
68
69The accuracy of the circle depends on the resolution of your screen. Lower-resolution screens
70may display less sharp circles.
71
72@italian
73
74Il comando ''FCIRCLE'' in BASIC disegna un cerchio sullo schermo e lo riempie. In altre parole,
75definisce un cerchio completo in base alle coordinate e al raggio specificati,
76e lo disegnerà riempito.
77
78Questo comando consente di disegnare un cerchio con coordinate iniziali in ''(x,y)''
79e raggio ''r''. Il colore è indicato dal parametro ''c''. Se l'ascissa e/o l'ordinata
80vengono omesse, verrà utilizzata l'ultima posizione grafica disegnata. Inoltre, è
81possibile omettere anche il colore e, se necessario, verrà utilizzato l'ultimo colore
82impostato con il comando ''PEN'' o ''INK''.
83
84Esiste anche un'altra sintassi aggiuntiva, che può essere utilizzata per disegnare
85ellissi: è possibile specificare sia i raggi ''rx'' che ''ry'' nel colore determinato
86da ''fq'' (vedere ''HIRES'').
87
88La precisione del cerchio dipende dalla risoluzione dello schermo. Gli schermi a
89bassa risoluzione potrebbero visualizzare cerchi meno nitidi.
90
91@syntax FCIRCLE [x], [y], r[, c]
92@syntax CIRCLE x, y, rx, ry[, c]
93
94@example ' Draw a filled circle
95@example FCIRCLE 100,100,42
96@example ' Draw a filled ellipse
97@example FCIRCLE 100,100,21,42
98@example FCIRCLE ,,21,RED
99
100@alias CIRCLE FILL
101
102@seeAlso CIRCLE
103
104@target all
105</usermanual> */
106/* <usermanual>
107@keyword CIRCLE FILL
108
109@english
110
111@italian
112
113@syntax CIRCLE FILL [x], [y], r[, c]
114@syntax CIRCLE FILL x, y, rx, ry[, c]
115
116@alias FCIRCLE
117
118@target all
119</usermanual> */
120
121void fcircle( Environment * _environment, char * _x, char * _y, char * _r, char * _c, int _preserve_color ) {
122
123 Variable * xCentre = variable_retrieve_or_define( _environment, _x, VT_POSITION, 0 );
124 Variable * yCentre = variable_retrieve_or_define( _environment, _y, VT_POSITION, 0 );
125 Variable * r = variable_retrieve_or_define( _environment, _r, VT_POSITION, 0 );
126
127 Variable * x = variable_temporary( _environment, VT_POSITION, "(x)" );
128 variable_move( _environment, r->name, x->name );
129 Variable * y = variable_temporary( _environment, VT_POSITION, "(y)" );
130 variable_store( _environment, y->name, 0 );
131 Variable * p = variable_temporary( _environment, VT_SWORD, "(p)" );
132
133 // plot( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_add( _environment, y->name, yCentre->name )->name, _c, 0 );
134 // plot( _environment, variable_sub( _environment, xCentre->name, x->name )->name, variable_add( _environment, y->name, yCentre->name )->name, _c, 0 );
135
136 draw( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_add( _environment, y->name, yCentre->name )->name, variable_sub( _environment, xCentre->name, x->name )->name, variable_add( _environment, y->name, yCentre->name )->name, _c, 0 );
137
138 // plot( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, _c, 0 );
139 // plot( _environment, variable_sub( _environment, xCentre->name, x->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, _c, 0 );
140
141 draw( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, variable_sub( _environment, xCentre->name, x->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, _c, 0 );
142
143 variable_move( _environment, variable_complement_const( _environment, r->name, 1 )->name, p->name );
144
145 begin_while( _environment );
146 begin_while_condition( _environment, variable_greater_than( _environment, x->name, y->name, 1 )->name );
147
148 if_then( _environment, variable_less_than_const( _environment, p->name, 0, 1 )->name );
149 variable_move( _environment, variable_add( _environment, variable_sl_const( _environment, y->name, 1 )->name, p->name )->name, p->name );
150 variable_increment( _environment, p->name );
151 else_if_then_label( _environment );
152 else_if_then( _environment, NULL );
153 variable_decrement( _environment, x->name );
154 variable_move( _environment, variable_add( _environment, variable_sl_const( _environment, y->name, 1 )->name, p->name )->name, p->name );
155 variable_move( _environment, variable_sub( _environment, p->name, variable_sl_const( _environment, x->name, 1 )->name )->name, p->name );
156 variable_increment( _environment, p->name );
157 end_if_then( _environment );
158
159 if_then( _environment, variable_less_than( _environment, x->name, y->name, 0 )->name );
160 exit_loop( _environment, 0 );
161 end_if_then( _environment );
162
163 // plot( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_add( _environment, y->name, yCentre->name )->name, _c, _preserve_color );
164 // plot( _environment, variable_sub( _environment, xCentre->name, x->name )->name, variable_add( _environment, y->name, yCentre->name )->name, _c, _preserve_color );
165
166 draw( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_add( _environment, y->name, yCentre->name )->name, variable_sub( _environment, xCentre->name, x->name )->name, variable_add( _environment, y->name, yCentre->name )->name, _c, _preserve_color );
167
168 // plot( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, _c, _preserve_color );
169 // plot( _environment, variable_sub( _environment, xCentre->name, x->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, _c, _preserve_color );
170
171 draw( _environment, variable_add( _environment, x->name, xCentre->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, variable_sub( _environment, xCentre->name, x->name )->name, variable_sub( _environment, yCentre->name, y->name )->name, _c, _preserve_color );
172
173 //if_then( _environment, variable_compare_not( _environment, x->name, y->name )->name );
174 // plot( _environment, variable_add( _environment, y->name, xCentre->name )->name, variable_add( _environment, x->name, yCentre->name )->name, _c, _preserve_color );
175 // plot( _environment, variable_sub( _environment, xCentre->name, y->name )->name, variable_add( _environment, x->name, yCentre->name )->name, _c, _preserve_color );
176
177 draw( _environment, variable_add( _environment, y->name, xCentre->name )->name, variable_add( _environment, x->name, yCentre->name )->name, variable_sub( _environment, xCentre->name, y->name )->name, variable_add( _environment, x->name, yCentre->name )->name, _c, _preserve_color );
178
179 // plot( _environment, variable_add( _environment, y->name, xCentre->name )->name, variable_sub( _environment, yCentre->name, x->name )->name, _c, _preserve_color );
180 // plot( _environment, variable_sub( _environment, xCentre->name, y->name )->name, variable_sub( _environment, yCentre->name, x->name )->name, _c, _preserve_color );
181
182 draw( _environment, variable_add( _environment, y->name, xCentre->name )->name, variable_sub( _environment, yCentre->name, x->name )->name, variable_sub( _environment, xCentre->name, y->name )->name, variable_sub( _environment, yCentre->name, x->name )->name, _c, _preserve_color );
183
184 //end_if_then( _environment );
185
186 variable_increment( _environment, y->name );
187
188 end_while( _environment );
189
190}
Variable * variable_add(Environment *_environment, char *_source, char *_destination)
Add two variable and return the sum of them.
Variable * variable_less_than_const(Environment *_environment, char *_source, int _destination, int _equal)
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
void variable_decrement(Environment *_environment, char *_source)
Decrement a variable by one.
Variable * variable_less_than(Environment *_environment, char *_source, char *_destination, int _equal)
Compare two variable and return the result of comparation.
Variable * variable_greater_than(Environment *_environment, char *_source, char *_destination, int _equal)
Compare two variable and return the result of comparation.
Variable * variable_move(Environment *_environment, char *_source, char *_destination)
Store the value of a variable inside another variable by converting it.
void variable_increment(Environment *_environment, char *_source)
Increment a variable by one.
Variable * variable_sl_const(Environment *_environment, char *_destination, int _steps)
Variable * variable_sub(Environment *_environment, char *_source, char *_dest)
Make a differenze between two variable and return the difference of them.
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
Variable * variable_store(Environment *_environment, char *_destination, unsigned int _value)
Store a direct value to a variable.
Variable * variable_complement_const(Environment *_environment, char *_source, int _value)
Calculate the complement of a variable.
void draw(Environment *_environment, char *_x0, char *_y0, char *_x1, char *_y1, char *_c, int _preserve_color)
Emit ASM code to implement DRAW command.
Definition draw.c:153
void else_if_then_label(Environment *_environment)
Emit ASM code for ... ELSE [IF] ....
void else_if_then(Environment *_environment, char *_expression)
Emit ASM code for ... ELSE [IF] ....
void end_if_then(Environment *_environment)
Emit ASM code for ENDIF.
Definition end_if_then.c:50
void exit_loop(Environment *_environment, int _number)
Emit ASM code for EXIT.
Definition exit_loop.c:97
void fcircle(Environment *_environment, char *_x, char *_y, char *_r, char *_c, int _preserve_color)
Emit code for CIRCLE command.
Definition fcircle.c:121
void if_then(Environment *_environment, char *_expression)
Emit ASM code for IF ... THEN ....
Definition if_then.c:123
char * name
Definition ugbc.h:979
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_POSITION
Definition ugbc.h:468
@ VT_SWORD
Definition ugbc.h:457
void begin_while_condition(Environment *_environment, char *_expression)
Definition while.c:99
void begin_while(Environment *_environment)
Emit ASM code for WHILE ....
Definition while.c:83
void end_while(Environment *_environment)
Emit ASM code for ... WEND.
Definition while.c:127