salut
comment dessiner un cercle sans utiliser le mot ( CIRCLE )
et sans utiliser SCREEN
en utilisent le mot LOCATE X,Y :x=horizontale :y= verticale
je sais que PI = 3.14159265 mai je ne sais pas si il faut employer pour dessiner le cercle
si il faut employer SIN et TAN pour faire se dessin
la dimantion que j'ai maximum verticale c'est 79
la dimantion que j'ai maximum horizontale c'est 48
le cercle devrait être plus petit que cette dimantion exemple 69 en verticale et en horizontale 38
mais si vous avez une idée autre que cette exemple donner moi votre idée
[fermé]
le cercle en qbasci
(12 messages) (2 voix)-
Posté il y a 5 années #
-
dessiner un cercle
CLS
DIM az(200), za(200)
DATA 4,43,4,42,4,41,4,40,4,39,4,38,4,37
DATA 5,36,5,35,5,34,5,33,5,32,5,31,5,30
DATA 6,29,6,28,6,27,6,26
DATA 7,25,7,24
DATA 8,23,8,22,8,21
DATA 9,20,9,19
DATA 10,18,10,17
DATA 11,16
DATA 12,15,12,14
DATA 13,13
DATA 14,12
DATA 15,11
DATA 16,10
DATA 17,10
DATA 18,9,19,9,20,9
DATA 21,8,22,8,23,8,24,8,25,8,26,8,27,8
DATA 28,9,29,9,30,9
DATA 31,10,32,10
DATA 33,11
DATA 34,12
DATA 35,13
DATA 36,14,36,15
DATA 37,16
DATA 38,17,38,18
DATA 39,19,39,20
DATA 40,21,40,22,40,23
DATA 41,24,41,25
DATA 42,26,42,27,42,28,42,29
DATA 43,30,43,31,43,32,43,33,43,34,43,35,43,36
DATA 44,37,44,38,44,39,44,40,44,41,44,42,44,43
DATA 43,44,43,45,43,46,43,47,43,48,43,49,43,50
DATA 42,51,42,52,42,53,42,54
DATA 41,55,41,56
DATA 40,57,40,58,40,59
DATA 39,60,39,61
DATA 38,62,38,63
DATA 37,64
DATA 36,65,36,66
DATA 35,67
DATA 34,68
DATA 33,69
DATA 32,70,31,70
DATA 30,71,29,71,28,71
DATA 27,72,26,72,25,72,24,72,23,72,22,72,21,72
DATA 20,71,19,71,18,71
DATA 17,70,16,70
DATA 15,69
DATA 14,68
DATA 13,67
DATA 12,66,12,65
DATA 11,64
DATA 10,63,10,62
DATA 9,61,9,60
DATA 8,59,8,58,8,57
DATA 7,56,7,55
DATA 6,54,6,53,6,52,6,51
DATA 5,50,5,49,5,48,5,47,5,46,5,45,5,44
FOR a = 1 TO 152
READ xx, yy: az(a) = xx: za(a) = yy
LOCATE az(a), za(a): PRINT "*"
NEXT aPosté il y a 4 années # -
Salutations.
Si tu n'utilises pas SCREEN, tu es en mode écran SCREEN 0 par défaut.
Tu as 25 lignes de 80 caractères ou 640 / 400 pixels et tu ne peux pas faire de dessin. Le seul avantage est de pouvoir écrire en utilisant 2 couleurs, ainsi que des couleurs clignotantes.
Si tu veux tracer des cercles en SCREEN 0, ils seront affreux par manque de fluidité. Quel avantage comptes-tu tirer de cet état ?
En SCREEN 12, tu peux dessiner des cercles ou des ellipses dont l'orientation est indifférente, sans utiliser CIRCLE avec le programme ci-dessous :
SCREEN 12: WINDOW SCREEN (1, 1)-(640, 480)
' coordonnées des Foyers
'X1% = 320: Y1% = 240 ) pour un cercle
'X2% = 320: Y2% = 240 ) les 2 foyers sont identiques
X1% = 30: Y1% = 450
X2% = 610: Y2% = 30
'Somme des rayons vecteurs
'S% = 300 pour un cercle (double du rayon)
S% = 740
FOR X% = 1 TO 640
FOR Y% = 1 TO 480
V1! = SQR((X% - X1%) ^ 2 + (Y% - Y1%) ^ 2)
V2! = SQR((X% - X2%) ^ 2 + (Y% - Y2%) ^ 2)
IF (V1! + V2! > S% - 1) AND (V1! + V2! < S% + 1) THEN
PSET (X%, Y%), 13
END IF
NEXT Y%, X%
PAINT (X1%, Y1%), CHR$(1) + CHR$(4) + CHR$(16) + CHR$(64), 13
Tu pourras faire varier X1%, Y1% et S%. Examine les résultats obtenus.
Salutations.Posté il y a 4 années # -
' cercle demo '
d$ = "*.PROGRAMME.DEMO.1.*"
a$ = d$ + STRING$(131, 42)
b = LEN(a$): c = 1
DO
FOR a = 152 TO 1 STEP -1
LOCATE az(a), za(a): PRINT MID$(a$, c, 1)
IF c = b THEN c = 0
c = c + 1
NEXT a
FOR x& = 0 TO 1000000: NEXT x&
a$ = RIGHT$(a$, LEN(a$) - 1) + LEFT$(a$, 1)
LOOP UNTIL LEN(INKEY$)Posté il y a 4 années # -
Salutations.
Le problème de POWER est le suivant : il veut écrire un message en 'rond', c'est-à-dire que ce dernier doit constituer un cercle parfait et tourner, dans un sens ou dans l'autre, les lettres ou caractères restant verticaux.
Il n'y a qu'un seul mode d'écran qui puisse se prêter à ce genre de gymnastique acrobatique, c'est SCREEN 12.
Pourquoi ? Dans ce mode, nous pouvons 'écrire' n'importe où car nous ne sommes pas limités par un LOCATE. Avec cette dernière instruction, l'ordonnée Y (la ligne) est comprise entre 1 et 30, l'abscisse X (la colonne) est comprise entre 1 et 80, ce qui est nettement insuffisant (2.400 possibilités).
Alors ? Il est nécessaire d'utiliser un PUT d'une table qui contient les données numériques du caractère à écrire. Et nous pouvons avoir Y compris entre 1 et 480 (diminué de la hauteur du caractère), et X compris entre 1 et 640 (diminué de la largeur du caractère). Cela va déjà beaucoup mieux et les possibilités de positionnement sont nettement plus nombreuses. Elles sont de 630 x 462 = 291.060 soit 121 fois plus (En lisant plus loin tu comprendras pourquoi je n'ai pas mis 640 x 480).
Habituellement, lorsque le déplacement d'une image ou caractère doit être effectué, le procédé est le suivant : effacement de l'image précédente, puis affichage de celle-ci à sa nouvelle position. Nous allons essayer une autre méthode (mais elle n'est valable que si X et Y ne varient que d'UN seul pixel) : Le déplacement à la nouvelle position va effacer automatiquement l'image précédente (à l'arrière de son sens de trajectoire), et pour cela l'image ou caractère (sauvegardé dans une table par un GET) sera 'entouré' d'un cadre de 1 pixel en largeur de même couleur que le fond de l'écran.
Explications complémentaires (avec SCREEN (1 ,1)-(640, 480) : un caractère est affiché dans une 'case' de 8 x 16 pixels. Je l'écris en couleur C et à l'intérieur de cette case, tous les pixels qui ne sont pas de couleur C, je les teinte en couleur F. J'entoure la case par un rectangle de couleur E. Ensuite, je sauvegarde (par GET) ce rectangle qui comporte la case, plus une bordure de 1 pixel, soit une surface de 10 x 18 pixels (c'est ce qui explique les 630 x 462 ci-dessus, car si il est possible de dessiner hors de l'écran, pour un PUT, tout le dessin obtenu doit être inclus dans la surface 640 x 480).
Je possède une ouïe très fine et j'entends le petit barbu du fond penser à deux questions très importantes : où et comment vais-je obtenir les valeurs numériques à mettre dans les tables pour effectuer les PUT ? Si je vais les chercher dans des fichiers, étant donné que je veux 223 caractères (c'est-à-dire tous les caractères de codification 32 à 254 inclus, pour être sûr de n'en louper aucun), cela va nécessiter autant de fichiers et occuper 223 unités d'allocation (en principe une unité correspond à 32.768 octets soit un peu plus 7.300.000 au total). Pour les utiliser, il me faudra 223 DIM et 223 OPEN et lectures de fichiers. OUF !
Je vais te proposer un autre méthode : un seul fichier qui comportera les datas numériques nécessaires aux 223 caractères (ce fichier aura une taille de 96.099 octets). Pour stocker (et retrouver) un caractère (10/18), il me faut 40 entiers longs soit 8920 pour les stocker tous.
- Etape de création : voir programme ci-dessous. J'écris le caractère avec LOCATE et COLOR C. Je teinte tous les pixels de la case (8/16) de couleur autre que C en couleur F. J'entoure la case d'un rectangle de couleur E, j'effectue un GET de ce rectangle (10/18) et j'ajoute au fichier des DATA les 40 entiers longs contenus dans la table.
- Etape de récupération/utilisation. Je lis, dans le fichier ci-dessus, les 8920 entiers longs et les 'stocke' dans une seule table générale. Je sais que tous les caractères sont présents et pour retrouver où ils se cachent, un peu d'arithmétique est nécessaire, en fonction du code ASCII.
Pour un caractère donné, après avoir déterminé sa position de départ dans la table générale, je transfère 40 valeurs dans un table auxiliaire et c'est cette dernière qui sera utilisée pour le PUT, avec les coordonnées de l'angle nord/ouest exprimées en pixels.
Si les couleurs obtenues conviennent, le programme n'est à exécuter qu'une seule fois.
Sinon, modifier C%, F% et E%, et nouvelle exécution, plusieurs fois si nécessaire jusqu'à obtention d'un résultat satisfaisant. Noter que E% est la couleur de l'écran du programme qui utilisera les dessins de ces caractères.
Le message suivant ne comporte que le programme.
Salutations.Posté il y a 4 années # -
'***************************************************** C:\PUB\PUB_CRD.BAS
'* Creation du fichier 'data' pour les caracteres *
'*****************************************************
' ***** ne pas OMETTRE de creer le repertoire PUB
CLS : OPTION BASE 1: SCREEN 12: WINDOW SCREEN (1, 1)-(640, 480)
DEFSTR A-Z
' $DYNAMIC
DIM Car&(40)
OPEN "C:\PUB\DATA_L" FOR OUTPUT AS #1
' ***** Couleurs modifiables
C% = 14 ' caractere
F% = 0 ' fond de la case
E% = 13 ' fond de l'ecran utilisateur du programme suivant
FOR ASKI% = 32 TO 254
Caractere = CHR$(ASKI%)
LOCATE 10, 10: COLOR C%: PRINT Caractere
LINE (71, 143)-(81, 161), E%, B
FOR X% = 72 TO 80: FOR Y% = 144 TO 160
IF POINT(X%, Y%) <> C% THEN PSET (X%, Y%), F%
NEXT Y%, X%
GET (71, 143)-(81, 161), Car&
FOR I% = 1 TO 40: PRINT #1, Car&(I%); : NEXT I%
NEXT ASKI%
ERASE Car&
' ************* Controle de la recuperation des datas
' ************* Et petit message 'descendant'
LINE (1, 1)-(640, 480), E%, BF
CLOSE
DIM Caractere&(40), Tous&(8920)
OPEN "C:\PUB\DATA_L" FOR INPUT AS #1
FOR I% = 1 TO 8920: INPUT #1, Tous&(I%): NEXT I%
Message = " ! O Chouette, c'est bientot l'Heure de la SIESTE ! ! ° "
' ***** Tu peux modifier ce message (mais pas trop long)
Lg% = LEN(Message)
FOR Y% = 1 TO 460
X% = -8
FOR M% = 1 TO Lg%
ASKI% = ASC(MID$(Message, M%, 1))
Position% = (ASKI% - 32) * 40
FOR I% = 1 TO 40
Position% = Position% + 1: Caractere&(I%) = Tous&(Position%)
NEXT I%
X% = X% + 9
PUT (X%, Y%), Caractere&, PSET
NEXT M%
Pause! = .05 ' ***** Modifiable
Debut! = TIMER
DO
LOOP UNTIL TIMER > Debut! + Pause!
NEXT Y%
SLEEP 10Posté il y a 4 années # -
Salutations.
Le petit programme ci-dessus (C:\PUB\PUB_CRD.BAS) n'est pas nécessaire. Bonne nouvelle. J'entends le petit barbu du fond penser "Alors, pourquoi l'avoir écrit ?". Excellente question à laquelle je me dois de répondre.
On ne peut récupérer les datas numériques d'une table/dessin (par GET) que si cette image est affichée sur l'écran et il y en avait 223 consécutives. J'ai donc craint que cette succession aussi rapide soit-elle provoque un scintillement désagréable. Or, il n'en est rien. Rien de visible.
Le fichier créé est inutile, mais tu peux le conserver pour d'autres applications.
Le programme peut donc passer directement à l'affichage 'circulaire'.
Tu le trouveras ci-dessous (C:\PUB\PUB.BAS).
Longueur du message : elle ne peut dépasser une centaine de caractères. Sinon, il y a interpénétration des caractères, ce qui est déjà le cas avec 100.
Sens de rotation : j'ai adopté le sens trigonométrique inverse.
Tu pourras effectuer et tester de nombreuses modifications, message, couleurs.
Bonne réception et salutations.Posté il y a 4 années # -
'************************
'* ROUE PUBLICITAIRE * C:\PUB\PUB.BAS
'************************
' ***** ne pas OMETTRE de creer le repertoire PUB
CLS : OPTION BASE 1: SCREEN 12: WINDOW SCREEN (1, 1)-(640, 480)
DEFSTR A-Z
' $DYNAMIC
DIM Car&(40), Tous&(8920)
' ***** Couleurs modifiables
C% = 14 ' caractere
F% = 5 ' fond d'ecran
FOR ASKI% = 32 TO 254
Caractere = CHR$(ASKI%)
LOCATE 10, 10: COLOR C%: PRINT Caractere
FOR X% = 73 TO 80: FOR Y% = 145 TO 160
IF POINT(X%, Y%) <> C% THEN PSET (X%, Y%), F%
NEXT Y%, X%
GET (73, 145)-(80, 160), Car&
FOR I% = 1 TO 40
T% = T% + 1: Tous&(T%) = Car&(I%)
NEXT I%
'SLEEP 1
NEXT ASKI%
LINE (1, 1)-(640, 480), F%, BF: CLOSE
DIM Caractere&(40)
' ***** Message 'tournant' (modification possible)
M = "--> NOUS N'IRONS PLUS au BOIS, les LAURIERS SONT COUPES !!!"
M = M + " La BELLE que VOILA IRA les RAMASSER !!! "
Nbc% = LEN(M): N = SPACE$(Nbc%): Fin% = Nbc% + 1
FOR I% = 1 TO Nbc%
Fin% = Fin% - 1: MID$(N, Fin%, 1) = MID$(M, I%, 1)
NEXT I%
M = N: LOCATE 2, 2: PRINT Nbc%
G! = 3.14159 * 2 / Nbc% ' ***** Angle en radian entre 2 caracteres
X.Centre% = 320: Y.Centre% = 230: Rayon% = 220 ' ***** Modifiables
' ***** Coordonnees des points d'affichage
DIM X.C!(Nbc%), Y.C!(Nbc%)
FOR P% = 1 TO Nbc%
X.C!(P%) = X.Centre% - Rayon% * COS(P% * G!)
Y.C!(P%) = Y.Centre% - Rayon% * SIN(P% * G!)
NEXT P%
FOR R% = 1 TO 200: CIRCLE (324, 238), R%, 0: NEXT R%
FOR R% = 240 TO 280: CIRCLE (324, 238), R%, 0: NEXT R%
DO
FOR C% = 1 TO Nbc%
ASKI% = ASC(MID$(M, C%, 1))
Position% = (ASKI% - 32) * 40
FOR I% = 1 TO 40
Position% = Position% + 1: Caractere&(I%) = Tous&(Position%)
NEXT I%
PUT (X.C!(C%), Y.C!(C%)), Caractere&, PSET
NEXT C%
M = RIGHT$(M, 1) + LEFT$(M, Nbc% - 1)
Debut! = TIMER ' ***** Ralentisseur
DO
LOOP UNTIL TIMER > Debut! + .5
LOOP UNTIL INKEY$ = CHR$(27)
Posté il y a 4 années # -
Salutations.
Avais-je raison de craindre un scintillement ? Oui, car il existe bel et bien comme le montre le programme ci-dessous, mais il est invisible sans le SLEEP 5 du début de programme (que tu pourras supprimer).
Le programme PUB fait 'tourner' le message dans le sens des aiguilles d'une montre.
La question m'a été posée : peut-on adopter le sens inverse ?
Oui, et c'est le cas du programme PUB_INV.
J'y ai modifié les couleurs. Tu trouveras ce programme ci-dessous.
Salutations.Posté il y a 4 années # -
'************************
'* ROUE PUBLICITAIRE * C:\PUB\PUB_INV.BAS
'************************
CLS : OPTION BASE 1: SCREEN 12: WINDOW SCREEN (1, 1)-(640, 480)
DEFSTR A-Z
' $DYNAMIC
DIM Car&(40), Tous&(8920)
' ***** Couleurs modifiables
SLEEP 5 ' ***** a supprimer apres essais
C% = 14 ' caractere
F% = 1 ' fond d'ecran
FOR ASKI% = 32 TO 254
Caractere = CHR$(ASKI%)
LOCATE 10, 10: COLOR C%: PRINT Caractere
FOR X% = 73 TO 80: FOR Y% = 145 TO 160
IF POINT(X%, Y%) <> C% THEN PSET (X%, Y%), F%
NEXT Y%, X%
GET (73, 145)-(80, 160), Car&
FOR I% = 1 TO 40
T% = T% + 1: Tous&(T%) = Car&(I%)
NEXT I%
FOR Tempo& = 1 TO 100000: NEXT Tempo& ' ***** a supprimer apres essais
NEXT ASKI%
LINE (1, 1)-(640, 480), F%, BF: CLOSE
DIM Caractere&(40)
' ***** Message 'tournant'(modification possible)
M = "--> NOUS N'IRONS PLUS au BOIS, les LAURIERS SONT COUPES !!!"
M = M + " La BELLE que VOILA IRA les RAMASSER !!! "
Nbc% = LEN(M)
N = SPACE$(Nbc%): Fin% = Nbc% + 1
FOR I% = 1 TO Nbc%
Fin% = Fin% - 1: MID$(N, Fin%, 1) = MID$(M, I%, 1)
NEXT I%
M = N:
LOCATE 2, 2: PRINT Nbc%
LOCATE 28, 2: PRINT "Sens TRIGO"
G! = -3.14159 * 2 / Nbc% ' ***** Angle en radian entre 2 caracteres (NEGATIF)
X.Centre% = 320: Y.Centre% = 230: Rayon% = 220 ' ***** Modifiables
' ***** Coordonnees des points d'affichage
DIM X.C!(Nbc%), Y.C!(Nbc%)
FOR P% = 1 TO Nbc%
X.C!(P%) = X.Centre% - Rayon% * COS(P% * G!)
Y.C!(P%) = Y.Centre% - Rayon% * SIN(P% * G!)
NEXT P%
FOR R% = 1 TO 200: CIRCLE (324, 238), R%, 2: NEXT R%
FOR R% = 240 TO 280: CIRCLE (324, 238), R%, 2: NEXT R%
DO
FOR C% = 1 TO Nbc%
ASKI% = ASC(MID$(M, C%, 1))
Position% = (ASKI% - 32) * 40
FOR I% = 1 TO 40
Position% = Position% + 1: Caractere&(I%) = Tous&(Position%)
NEXT I%
PUT (X.C!(C%), Y.C!(C%)), Caractere&, PSET
NEXT C%
M = RIGHT$(M, 1) + LEFT$(M, Nbc% - 1)
Debut! = TIMER ' ***** Ralentisseur
DO
LOOP UNTIL TIMER > Debut! + .25
LOOP UNTIL INKEY$ = CHR$(27)Posté il y a 4 années # -
Salutations.
J'entends le voisin du petit barbu du fond penser : "Ne serait-ce pas plus joli si le message s'affichait et défilait sur une ellipse ?"
Si, c'est certain, et les modifications ne sont pas très importantes. Avec un autre avantage : la longueur d'affichage va augmenter et nous pourrons avoir un message un peu plus conséquent (120 caractères).
Si tu fais des modifications, notamment sur le rayon, le coefficient 'ellipse' que j'ai mis à 0.75, fais attention à ce que tous les PUT de caractères ne se fassent qu'à l'intérieur de l'écran, sinon erreur.
Tu trouveras le programme PUB_INVE ci-dessous.
J'ai adopté une ellipse aplatie, mais tu peux choisir une 'verticale' (avec coefficient 'ellipse' supérieur à 1) et il te faudra dans ce cas diminuer le rayon et raccourcir le message.
Comme tu le constateras, j'ai effectué quelques modifications.
Bonne récupération.
Salutations.Posté il y a 4 années # -
'***************************
'* ELLIPSE PUBLICITAIRE * C:\PUB\PUB_INVE.BAS
'***************************
' ***** Message sur une ellipse
CLS : OPTION BASE 1: SCREEN 12: WINDOW SCREEN (1, 1)-(640, 480)
DEFSTR A-Z
DIM Car&(40), Tous&(8920)
' ***** Couleurs modifiables
C% = 15 ' caractere
F% = 1 ' fond d'ecran
FOR ASKI% = 32 TO 254
Caractere = CHR$(ASKI%)
LOCATE 10, 10: COLOR C%: PRINT Caractere
FOR X% = 73 TO 80: FOR Y% = 145 TO 160
IF POINT(X%, Y%) <> C% THEN PSET (X%, Y%), F%
NEXT Y%, X%
GET (73, 145)-(80, 160), Car&
FOR I% = 1 TO 40
T% = T% + 1: Tous&(T%) = Car&(I%)
NEXT I%
NEXT ASKI%
LINE (1, 1)-(640, 480), F%, BF: CLOSE
DIM Caractere&(40)
' ***** Message 'tournant'(modification possible)
M = "--> NOUS N'IRONS PLUS au BOIS, les LAURIERS SONT COUPES !!!"
M = M + " La BELLE que VOILA IRA les RAMASSER ! "
M = M + "ENTREZ dans la DANSE "
Nbc% = LEN(M): N = SPACE$(Nbc%): Fin% = Nbc% + 1
FOR I% = 1 TO Nbc%
Fin% = Fin% - 1: MID$(N, Fin%, 1) = MID$(M, I%, 1)
NEXT I%
M = N: LOCATE 2, 2: PRINT Nbc%
LOCATE 28, 2: COLOR 15: PRINT "Sens TRIGO"
G! = -3.14159 * 2 / Nbc% ' ***** Angle en radian entre 2 caracteres
X.Centre% = 320: Y.Centre% = 230: Rayon% = 300 ' ***** Modifiables
' ***** Coordonnees des points d'affichage
DIM X.C!(Nbc%), Y.C!(Nbc%)
FOR P% = 1 TO Nbc%
X.C!(P%) = X.Centre% - Rayon% * COS(P% * G!)
Y.C!(P%) = Y.Centre% - Rayon% * SIN(P% * G!) * .75
NEXT P%
FOR R% = 260 TO 280: CIRCLE (320, 238), R%, 4, , , .75: NEXT R%
Dalle$ = CHR$(4) + CHR$(16) + CHR$(64)
PAINT (324, 238), Dalle$, 4
FOR R% = 320 TO 340: CIRCLE (320, 238), R%, 4, , , .75: NEXT R%
DO
FOR C% = 1 TO Nbc%
ASKI% = ASC(MID$(M, C%, 1))
Position% = (ASKI% - 32) * 40
FOR I% = 1 TO 40
Position% = Position% + 1: Caractere&(I%) = Tous&(Position%)
NEXT I%
PUT (X.C!(C%), Y.C!(C%)), Caractere&, PSET
NEXT C%
M = RIGHT$(M, 1) + LEFT$(M, Nbc% - 1)
Debut! = TIMER ' ***** Ralentisseur
DO
LOOP UNTIL TIMER > Debut! + .25
LOOP UNTIL INKEY$ = CHR$(27)Posté il y a 4 années #
Sujet fermé
Sujet fermé. Réponse impossible.
