Tracé d'un cercle basique

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Tracé d'un cercle basique

Message par sospel »

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 :wink:

Sospel
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Tracé d'un cercle basique

Message par Marc56 »

Bonjour,

Pour ce style de graphisme, la lib VectorDrawing va te simplifier la tâche. :wink:

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.
8)
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Tracé d'un cercle basique

Message par case »

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().
ImageImage
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Tracé d'un cercle basique

Message par kernadec »

bjr à tous

pour tracer un arc de cercle avec la fonction line() :wink:
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
Mode Arc avec Graduations

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.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Tracé d'un cercle basique

Message par Mesa »

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.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Tracé d'un cercle basique

Message par kernadec »

bjr Mesa
Merci, c'est vrai :mrgreen:
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 8O
je lui ai fait un ptit résumé :mrgreen:
Cordialement
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Tracé d'un cercle basique

Message par Mesa »

Rapporteur avec la bibliothèque Vector de PureBasic.

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

Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Tracé d'un cercle basique

Message par SPH »

@Mesa
Non, c'est étiré vers le haut. 😥

Mais bravo pour ce rapporteur ! 😊

!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.12LTS- 64 bits
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Tracé d'un cercle basique

Message par Mesa »

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.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Tracé d'un cercle basique

Message par SPH »

Image

!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.12LTS- 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Tracé d'un cercle basique

Message par Ar-S »

Pareil... Forme elliptique. Avec DPI ou pas dans la compilation.
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
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Tracé d'un cercle basique

Message par Marc56 »

Pour un truc rond.
Ligne 29

Code : Tout sélectionner

	Excentricite.f = 1   ; Pas ResolutionY/ResolutionX
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.

:wink:
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Re: Tracé d'un cercle basique

Message par sospel »

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
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Tracé d'un cercle basique

Message par kernadec »

bjr à tous
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.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Tracé d'un cercle basique

Message par SPH »

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) 8O

!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.12LTS- 64 bits
Répondre