Tracé d'un cercle basique
Tracé d'un cercle basique
Bonjour
je voudrais me lancer dans la rédaction d'un HE-NAUR-ME programme en Purebasic : le tracé d'un cercle trigonométrique de 180° , genre rapporteur Graphoplex : lignes et graduations en traits fins . Point !
Bon, j'étais tout content de trouver un mot-clé "CIRCLE" supposé tracer un cercle en noir sur fond blanc et une "LINE" pour les graduations.
Eh ben, c'est raté : je n'obtiens qu'un cercle rempli uniformément d'une couleur, et surtout pas sous forme d'un cercle tracé "au compas"
Alors, je fais quoi ???
Merci d'avance pour m'aider dans cette tâche de longue haleine
Sospel
je voudrais me lancer dans la rédaction d'un HE-NAUR-ME programme en Purebasic : le tracé d'un cercle trigonométrique de 180° , genre rapporteur Graphoplex : lignes et graduations en traits fins . Point !
Bon, j'étais tout content de trouver un mot-clé "CIRCLE" supposé tracer un cercle en noir sur fond blanc et une "LINE" pour les graduations.
Eh ben, c'est raté : je n'obtiens qu'un cercle rempli uniformément d'une couleur, et surtout pas sous forme d'un cercle tracé "au compas"
Alors, je fais quoi ???
Merci d'avance pour m'aider dans cette tâche de longue haleine
Sospel
Re: Tracé d'un cercle basique
Bonjour,
Pour ce style de graphisme, la lib VectorDrawing va te simplifier la tâche.
Ne pas oublier que les fonctions liées aux angles sont exprimés en Radian dans les langages de programmation, contrairement aux calculatrices qui sont en degrés. Les fonctions Degree()/Radian() de la lib Math permettent de passer d'une unité à l'autre.
PS. "Graphoplex" est une marque d'outils de dessin, pour ceux qui ne savent pas.
Enjoy, grâce à PB ton programme sera petit.
Pour ce style de graphisme, la lib VectorDrawing va te simplifier la tâche.
Ne pas oublier que les fonctions liées aux angles sont exprimés en Radian dans les langages de programmation, contrairement aux calculatrices qui sont en degrés. Les fonctions Degree()/Radian() de la lib Math permettent de passer d'une unité à l'autre.
PS. "Graphoplex" est une marque d'outils de dessin, pour ceux qui ne savent pas.
Enjoy, grâce à PB ton programme sera petit.
Re: Tracé d'un cercle basique
avec la commande circle() il est possible d'avoir un cercle vide en utilisant la commande DrawingMode(#PB_2DDrawing_Outlined ) avant de dessiner le cercle.
documentation purebasic fonction circle a écrit :Le mode de remplissage du "rectangle" (lire cercle typo dans la doc) est défini par la fonction DrawingMode().
Re: Tracé d'un cercle basique
bjr à tous
pour tracer un arc de cercle avec la fonction line()
Cordialement
PS: pour ceux qui ont oublié la syntaxe pour avoir le code forum en couleur
if faut ajouter aux balises codes : "-pb" exemple: [ code-pb ][ /code-pb ]
Mode Arc avec Graduations
pour tracer un arc de cercle avec la fonction line()
Cordialement
PS: pour ceux qui ont oublié la syntaxe pour avoir le code forum en couleur
if faut ajouter aux balises codes : "-pb" exemple: [ code-pb ][ /code-pb ]
Code : Tout sélectionner
Global x.d, y.d, xx.d, yy.d, cw.l, ch.l, rayon.l,dg.l
cw = 300 ; centre x
ch = 300 ; centre y
rayon = 200
dg = 180 ; taille de l'arc
OpenWindow(0,0,0,600,600,"trace cercle",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StartDrawing(WindowOutput(0))
DrawingMode(4)
For o = 0 To dg
x = cw + rayon * Sin(Radian(o))
y = ch + rayon * Cos(Radian(o))
xx = cw + rayon * Sin(Radian(o + 1))
yy = ch + rayon * Cos(Radian(o + 1))
LineXY(x,y,xx,yy,RGB(0,0,0))
Next o
StopDrawing()
Repeat
EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow
Code : Tout sélectionner
Global cw.l,ch.l,rayon.l,x.d,y.d,xx.d,yt.d,dg.l
Global wlargeur.l,whauteur.l
wlargeur = 600
whauteur = 600
rayon = 300
cw = 400
ch = 400
debut.l = 0
fin.l = 360
Procedure dessin(debut.l,fin.l)
DrawingMode(4)
For o = debut To fin -1
x = cw + rayon * Sin(Radian(o))
y = ch + rayon * Cos(Radian(o))
xx = cw + rayon * Sin(Radian(o + 1))
yy = ch + rayon * Cos(Radian(o + 1))
LineXY(x,y,xx,yy,RGB(0,0,0))
Next o
For o = debut To fin Step 30
x = cw + rayon * Sin(Radian(o))
y = ch + rayon * Cos(Radian(o))
xx = cw + (rayon - rayon / 17) * Sin(Radian(o))
yy = ch + (rayon - rayon / 17) * Cos(Radian(o))
LineXY(xx,yy,x,y,RGB(0,0,0))
x = cw + (rayon - rayon / 11) * Sin(Radian(o))
y = ch + (rayon - rayon / 11) * Cos(Radian(o))
xx = cw + (rayon - rayon / 3.5) * Sin(Radian(o))
yy = ch + (rayon - rayon / 3.5) * Cos(Radian(o))
LineXY(xx,yy,x,y,RGB(0,0,0))
If o <= fin - 1
For i = 1 To 29
If i = 5 Or i = 15 Or i = 25
x = cw + rayon * Sin(Radian(i + o))
y = ch + rayon * Cos(Radian(i + o))
xx = cw + (rayon - rayon / 22) * Sin(Radian(i + o))
yy = ch + (rayon - rayon / 22) * Cos(Radian(i + o))
LineXY(x,y,xx,yy,RGB(0,0,0))
ElseIf i = 10 Or i = 20
x = cw + rayon * Sin(Radian(i + o))
y = ch + rayon * Cos(Radian(i + o))
xx = cw + (rayon - rayon / 16) * Sin(Radian(i + o))
yy = ch + (rayon - rayon / 16) * Cos(Radian(i + o))
LineXY(xx,yy,x,y,RGB(0,0,0))
Else
x = cw + rayon * Sin(Radian(i + o))
y = ch + rayon * Cos(Radian(i + o))
xx = cw + (rayon - rayon / 33) * Sin(Radian(i + o))
yy = ch + (rayon - rayon / 33) * Cos(Radian(i + o))
LineXY(xx,yy,x,y,RGB(0,0,0))
EndIf
Next i
EndIf
Next o
LineXY(cw - rayon / 20,ch,cw + rayon / 20,ch,RGB(0,0,0))
LineXY(cw,ch - rayon / 20,cw,ch + rayon / 20,RGB(0,0,0))
EndProcedure
OpenWindow(0,0,0,800,800,"trace cercle",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StartDrawing(WindowOutput(0))
dessin(120,240)
StopDrawing()
Repeat
EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow
Dernière modification par kernadec le jeu. 15/sept./2022 15:35, modifié 5 fois.
Re: Tracé d'un cercle basique
Ce qui est amusant c'est que Kernadec a déjà fait ça mais c'est pour windows seulement.
viewtopic.php?t=8277&sid=bfaf9f0853f1a6 ... 639c026171
M.
viewtopic.php?t=8277&sid=bfaf9f0853f1a6 ... 639c026171
M.
Re: Tracé d'un cercle basique
bjr Mesa
Merci, c'est vrai
mais là, il a fait la demande d'un arc de cercle gradués
comme c'est pas toujours facile de récupérer
ce qu'on souhaite dans les codes quand on est débutant en PureBasic
je lui ai fait un ptit résumé
Cordialement
Merci, c'est vrai
mais là, il a fait la demande d'un arc de cercle gradués
comme c'est pas toujours facile de récupérer
ce qu'on souhaite dans les codes quand on est débutant en PureBasic
je lui ai fait un ptit résumé
Cordialement
Re: Tracé d'un cercle basique
Rapporteur avec la bibliothèque Vector de PureBasic.
Merci de me dire si les cercles sont bien ronds ou non.
Merci de me dire si les cercles sont bien ronds ou non.
Code : Tout sélectionner
;- DESKTOP
ExamineDesktops()
ResolutionX=DesktopWidth(0)
ResolutionY=DesktopHeight(0)
;Fenêtre dim
ww=800
wh=600
;Coordonnées centre, initial, final
xc=ww/2
yc=wh-50
xi=0
yi=0
xf=ww
yf=wh
;Rayon ext , int
RExt.d=400.0
RInt.d=300.0
;Angle départ, fin
anglei.d = 180.0
anglef.d= 360.0
If OpenWindow(0, 0, 0, ww, wh, "Rapporteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Excentricite.f=ResolutionY/ResolutionX
CanvasGadget(0, 0, 0, ww, wh)
If StartVectorDrawing(CanvasVectorOutput(0))
; - Croix Centrale
;==============
MovePathCursor(xc,0)
AddPathLine(xc, yf)
MovePathCursor(0,yc)
AddPathLine(xf, yc)
; VectorSourceColor(RGBA(0, 0, 255, 255))
DotPath(1, 10, #PB_Path_RoundEnd)
;- Cercle extérieur
;==================
;AddPathCircle(Xc, Yc, RExt, 0, 360)
AddPathEllipse(Xc, Yc, RExt*Excentricite, RExt, anglei, anglef)
VectorSourceColor(RGBA(255, 0, 0, 255))
StrokePath(1)
;- Cercle intérieur
;==================
AddPathEllipse(Xc, Yc, RInt*Excentricite, RInt, anglei, anglef)
VectorSourceColor(RGBA(255, 0, 0, 128))
StrokePath(1)
;- Limite
;=========
depart.f=0
anglelimite1.f=10; deg
anglelimite2.f=5 ; deg
longlimite1.f=70
longlimite2.f=90
;Limite 5°
;---------
For i=36 To 72
xxi.f=xc+ (RInt+longlimite2)*Excentricite*Cos(Radian(i*anglelimite2+depart))
yyi.f=yc+ (RInt+longlimite2)*Sin(Radian(i*anglelimite2+depart))
xxf.f=xc+ RExt*Excentricite*Cos(Radian(i*anglelimite2+depart))
yyf.f=yc+ RExt*Sin(Radian(i*anglelimite2+depart))
MovePathCursor(xxi,yyi)
AddPathLine(xxf,yyf)
Next i
;Limite 10°
; ----------
For i=18 To 36
xxi.f=xc + (RInt+longlimite1)*Excentricite*Cos(Radian(i*anglelimite1+depart))
yyi.f=yc + (RInt+longlimite1)*Sin(Radian(i*anglelimite1+depart))
xxf.f=xc + RExt*Excentricite*Cos(Radian(i*anglelimite1+depart))
yyf.f=yc + RExt*Sin(Radian(i*anglelimite1+depart))
margetext.f = 20.0
xxtext.f=xc+ (RInt+longlimite1-margetext)*Excentricite*Cos(Radian(i*anglelimite1+depart))
yytext.f=yc+ (RInt+longlimite1-margetext)*Sin(Radian(i*anglelimite1+depart))
text$=Str((i-18)*10)
xxtext = xxtext - VectorTextWidth(text$)/2
yytext = yytext - VectorTextHeight(text$)/2
MovePathCursor(xxi,yyi)
AddPathLine(xxf,yyf)
MovePathCursor(xxtext,yytext)
VectorSourceColor(RGBA(0, 0, 0, 80))
DrawVectorText(text$)
Next i
VectorSourceColor(RGBA(0, 0, 0, 128))
StrokePath(1)
StopVectorDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Re: Tracé d'un cercle basique
@Mesa
Non, c'est étiré vers le haut.
Mais bravo pour ce rapporteur !
Non, c'est étiré vers le haut.
Mais bravo pour ce rapporteur !
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Re: Tracé d'un cercle basique
C'est bizarre, chez moi, c'est rond, et je n'ai ni zoom, ni dpi autre que le dpi standard 96, je suis resté en 1024x768, je me demande bien d'où ça vient ?
Les fonctions "circle" de pb donnent des ellipses chez moi.
M.
Les fonctions "circle" de pb donnent des ellipses chez moi.
M.
Re: Tracé d'un cercle basique
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Re: Tracé d'un cercle basique
Pareil... Forme elliptique. Avec DPI ou pas dans la compilation.
Je suis en 125%
Je suis en 125%
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Tracé d'un cercle basique
Pour un truc rond.
Ligne 29
Pour afficher en fonction du DPI, tracer en 100% puis utiliser DesktopScaledX(), DesktopScaledY() après.
Cela ne sert que si on veut afficher quelque chose en mesure (ex: cm) plutôt qu'en pixels, et il faut connaître le DPI écran.
Ligne 29
Code : Tout sélectionner
Excentricite.f = 1 ; Pas ResolutionY/ResolutionX
Cela ne sert que si on veut afficher quelque chose en mesure (ex: cm) plutôt qu'en pixels, et il faut connaître le DPI écran.
Re: Tracé d'un cercle basique
Bon, un grand Merci pour la douzaine de réponses, en particulier à MESA et KERNADEC !
La solution de KERNADEC est la plus proche du "rapporteur" que je souhaite utiliser et je vais m'en inspirer, en y ajoutant quelques spécificités personnelles .
Par exemple certaines valeurs des graduations, pas en ° d'angle mais en Heures et Minutes, pour faire un cercle gradué pour les coordonnées d'Ascension Droite en Astronomie (cf WikiPedia) . En plus elles seront écrites à l'envers car lues à travers une petite lunette astronomique, qui inverse les images ... Bon, j'ai du boulot ..!!
Comme MESA a encore quelques problèmes avec l'excentricité de son cercle, j'attendrai qu'il les résolve, car cela dépasse mes faibles connaissances en PureBasic
A bientôt pour le résultat,
Cordialement
SosPel
La solution de KERNADEC est la plus proche du "rapporteur" que je souhaite utiliser et je vais m'en inspirer, en y ajoutant quelques spécificités personnelles .
Par exemple certaines valeurs des graduations, pas en ° d'angle mais en Heures et Minutes, pour faire un cercle gradué pour les coordonnées d'Ascension Droite en Astronomie (cf WikiPedia) . En plus elles seront écrites à l'envers car lues à travers une petite lunette astronomique, qui inverse les images ... Bon, j'ai du boulot ..!!
Comme MESA a encore quelques problèmes avec l'excentricité de son cercle, j'attendrai qu'il les résolve, car cela dépasse mes faibles connaissances en PureBasic
A bientôt pour le résultat,
Cordialement
SosPel
Re: Tracé d'un cercle basique
bjr à tous
Exemple Cercle Gradué avec VectorDrawing()
Cordialement
Exemple Cercle Gradué avec VectorDrawing()
Cordialement
Code : Tout sélectionner
ch.d=250
cw.d=250
rayon.d=200
If OpenWindow(0, 0, 0, 500, 500, " Cercle Gradué avec VectorDrawing ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 500, 500)
If StartVectorDrawing(CanvasVectorOutput(0))
AddPathCircle(cw,ch, rayon, 0, 360)
For o= 0 To 360 Step 5
x.d = cw + rayon * Sin(Radian(o))
y.d = ch + rayon * Cos(Radian(o))
xx.d = cw + (rayon -20) * Sin(Radian(o))
yy.d = ch + (rayon -20) * Cos(Radian(o))
MovePathCursor(x, y)
AddPathLine(x, y, #PB_Path_Default )
AddPathLine(xx, yy, #PB_Path_Default)
MovePathCursor(xx, yy)
Next o
VectorSourceColor(RGBA(0, 0, 0, 255))
StrokePath(2, #PB_Path_RoundCorner)
StopVectorDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Dernière modification par kernadec le lun. 19/sept./2022 9:52, modifié 2 fois.
Re: Tracé d'un cercle basique
Merci kernadec.
Je ne connais pas VectorDrawing() et ça a l'air pas mal du tout (surpris qu'un code aussi court fasse ce résultat)
Je ne connais pas VectorDrawing() et ça a l'air pas mal du tout (surpris qu'un code aussi court fasse ce résultat)
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits