Page 1 sur 2
[Résolu] Placer des points sur un cercle
Publié : mar. 08/sept./2020 9:25
par falsam
Bonjour. Quand je lance le code qui suit, le point 0 s'affiche à droite du cercle. J'aimerais que ce point s'affiche en haut du cercle.
D'avance merci pour votre aide.
Code : Tout sélectionner
EnableExplicit
Enumeration window
#mf
EndEnumeration
Enumeration gadget
#mfResult
#mfModulo
#mfView
EndEnumeration
; Font d'affichage des nombres
Global Font = LoadFont(#PB_Any, "", 10)
; Sommaire
Declare Start()
Declare ViewResult()
Declare Exit()
Start()
Procedure Start()
OpenWindow(#mf, 0, 0, 1024, 768, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; Affichage du résultat
CanvasGadget(#mfResult, 0, 0, 1024, 700)
TextGadget(#PB_Any, 10, 710, 100, 24, "Nombre de points")
StringGadget(#mfModulo, 120, 710, 50, 24, "10", #PB_String_Numeric | #PB_String_InPlace)
ButtonGadget(#mfView, 930, 710, 80, 24, "View")
SetActiveGadget(#mfModulo)
ViewResult()
; Déclencheur
BindGadgetEvent(#mfView, @ViewResult())
BindEvent(#PB_Event_CloseWindow, @Exit())
Repeat : WaitWindowEvent(10) : ForEver
EndProcedure
Procedure ViewResult()
; Centre du cercle & Rayon
Protected XC = GadgetWidth(#mfResult)/2
Protected YC = GadgetHeight(#mfResult)/2
Protected Radius, X, Y, N.f, I
; Nombre de points sur le cercle
Protected Modulo = Val(GetGadgetText(#mfModulo))
If Modulo < 1
MessageRequester("Information", "Le nombre de points doit être supérieur à 0")
SetGadgetText(#mfModulo, "1")
Modulo = 1
EndIf
If StartDrawing(CanvasOutput(#mfResult))
; Clear Canvas
Box(0, 0, 1024, 700, RGB(255, 255, 255))
While N < 360
Radius = 250
; Affichage du point
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Circle(X, Y, 2, RGB(255, 69, 0))
; Affichage de la valeur du point
Radius = 300
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
DrawingFont(FontID(Font))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X, Y, Str(I), RGB(0, 0, 255))
; Point suivant
N + 360/Modulo
I + 1
Wend
StopDrawing()
EndIf
EndProcedure
Procedure Exit()
End
EndProcedure
Re: Placer des points sur un cercle
Publié : mar. 08/sept./2020 9:52
par Mindphazer
Bonjour Falsam
J'ai fait un truc tout con :
j'ai positionné ta variable N à -90
Et modifié le while
Et ça a l'air de fonctionner, mais je ne sais pas si c'est exactement ce que tu veux...
Code : Tout sélectionner
EnableExplicit
Enumeration window
#mf
EndEnumeration
Enumeration gadget
#mfResult
#mfModulo
#mfView
EndEnumeration
; Font d'affichage des nombres
Global Font = LoadFont(#PB_Any, "", 10)
; Sommaire
Declare Start()
Declare ViewResult()
Declare Exit()
Start()
Procedure Start()
OpenWindow(#mf, 0, 0, 1024, 768, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; Affichage du résultat
CanvasGadget(#mfResult, 0, 0, 1024, 700)
TextGadget(#PB_Any, 10, 710, 100, 24, "Nombre de points")
StringGadget(#mfModulo, 120, 710, 50, 24, "10", #PB_String_Numeric | #PB_String_InPlace)
ButtonGadget(#mfView, 930, 710, 80, 24, "View")
SetActiveGadget(#mfModulo)
ViewResult()
; Déclencheur
BindGadgetEvent(#mfView, @ViewResult())
BindEvent(#PB_Event_CloseWindow, @Exit())
Repeat : WaitWindowEvent(10) : ForEver
EndProcedure
Procedure ViewResult()
; Centre du cercle & Rayon
Protected XC = GadgetWidth(#mfResult)/2
Protected YC = GadgetHeight(#mfResult)/2
Protected Radius, X, Y, N.f, I
; Nombre de points sur le cercle
Protected Modulo = Val(GetGadgetText(#mfModulo))
If Modulo < 1
MessageRequester("Information", "Le nombre de points doit être supérieur à 0")
SetGadgetText(#mfModulo, "1")
Modulo = 1
EndIf
N = -90
If StartDrawing(CanvasOutput(#mfResult))
; Clear Canvas
Box(0, 0, 1024, 700, RGB(255, 255, 255))
While N < 270
Radius = 250
; Affichage du point
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
Circle(X, Y, 2, RGB(255, 69, 0))
; Affichage de la valeur du point
Radius = 300
X = XC + Radius * Cos(N * #PI / 180)
Y = YC + Radius * Sin(N * #PI / 180)
DrawingFont(FontID(Font))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X, Y, Str(I), RGB(0, 0, 255))
; Point suivant
N + 360/Modulo
I + 1
Wend
StopDrawing()
EndIf
EndProcedure
Procedure Exit()
End
EndProcedure
Re: Placer des points sur un cercle
Publié : mar. 08/sept./2020 10:00
par falsam
Merci Mindphazer. Normalement ça devrait être bon. La suite de mon code c'est :
- mémoriser les coordonnées de chaque point dans un tableau ou une map je ne sais pas encore
- Tracer des lignes entres certains points.
Je teste ça ......
Re: Placer des points sur un cercle
Publié : mar. 08/sept./2020 10:14
par falsam
C'est parfait merci beaucoup. Sujet résolu. i'm happy

Re: [Résolu] Placer des points sur un cercle
Publié : mar. 08/sept./2020 16:07
par Micoute
C'est curieux falsam que tu pose cette question, car c'est toi qui m'avais aidé quand j'ai fait ma première horloge, et j'en profite pour t'en remercier encore.
Re: [Résolu] Placer des points sur un cercle
Publié : mar. 08/sept./2020 18:26
par SPH
Micoute a écrit :C'est curieux falsam que tu pose cette question, car c'est toi qui m'avais aidé quand j'ai fait ma première horloge, et j'en profite pour t'en remercier encore.
N'oublies pas que, depuis, il est tombé sur la tête

Re: [Résolu] Placer des points sur un cercle
Publié : mer. 09/sept./2020 13:36
par Micoute
Dans ce cas, il n'est pas le seul.
Re: [Résolu] Placer des points sur un cercle
Publié : mer. 09/sept./2020 18:56
par Ollivier
Même sans matériel informatique, j'ai du mal à voir quelquechose de résolu si vous oubliez le type de variable.
A moins de n'avoir besoin que des quatres angles "cardinaux" (0, 90, 180 et 270 degrés).
Re: [Résolu] Placer des points sur un cercle
Publié : mer. 09/sept./2020 19:38
par GallyHC
Bonjour,
Pour moi, elles sont typer :
Code : Tout sélectionner
Protected XC = GadgetWidth(#mfResult)/2
Protected YC = GadgetHeight(#mfResult)/2
Protected Radius, X, Y, N.f, I
C'est qu'elles sont de type "integer", petit extrait de la doc de PureBasic :
Code : Tout sélectionner
Permet d'assigner le même type de données à une série de variables.
Sans ce mot clé, les variables sont crées avec le type par défaut de PureBasic qui est le type entier INTEGER. Pour rappel le type INTEGER vaut:
4 octets (avec un compilateur 32 bits) allant de -2147483648 à +2147483647
8 octets (avec un compilateur 64 bits) allant de -9223372036854775808 à +9223372036854775807
Re: [Résolu] Placer des points sur un cercle
Publié : jeu. 10/sept./2020 6:59
par Ollivier
Bonjour Gally,
ces variables ont besoin d'être typées Double (64 bits) ou Flottant (32 bits).
Ceci, car la pondération qui permet la forme d'un cercle, ou d'une sinusoïde se situe entre -1 et +1, et utilise les valeurs décimales entre ces extrema pour être tracées, non pas les valeurs entières.
Code : Tout sélectionner
Define.D Decimal = Cos(Radian(45) )
Define.I Entier = Cos(Radian(45) )
Debug Decimal
Debug Entier
Re: [Résolu] Placer des points sur un cercle
Publié : jeu. 10/sept./2020 8:52
par GallyHC
Bonjour Ollivier,
Oui pour avoir une précision, mais comme c'est pour de l'affichage de point, la coordonnée est convertie a sont plus proche entier.
Cordialement,
GallyHC
Re: [Résolu] Placer des points sur un cercle
Publié : jeu. 10/sept./2020 12:31
par falsam
Ollivier a écrit :Même sans matériel informatique, j'ai du mal à voir quelquechose de résolu si vous oubliez le type de variable.
Ollivier a écrit :ces variables ont besoin d'être typées Double (64 bits) ou Flottant (32 bits).
Sans typage, les variables sont de type
Integer.
Avec la fonction
LineXY(X1, Y1, X2, Y2 [, Couleur]) les variables X1, Y1, X2, Y2 sont elles aussi de type
Integer 
Re: [Résolu] Placer des points sur un cercle
Publié : jeu. 10/sept./2020 13:11
par Ollivier
Heureux de te savoir vivant "GallyHC",
tu peux effectivement mettre XC et YC aussi comme des entiers. Mais voilà le désordre technique en coulisse une fois compilé : regarde l'équivalent en langage Assembleur.
Autant tout mettre en flottant :
Code : Tout sélectionner
Define.D ; ici commence la zone de calcul trigo
; ...
Define.I ; ici finit la zone de calcul trigo
Re: [Résolu] Placer des points sur un cercle
Publié : ven. 11/sept./2020 0:10
par Ollivier
falsam a écrit :Sans typage, les variables sont de type Integer.
Avec la fonction LineXY(X1, Y1, X2, Y2 [, Couleur]) les variables X1, Y1, X2, Y2 sont elles aussi de type Integer
Et pourquoi pas
CursorLocate(EntierX, EntierY) aussi, tant que t'y es ?
Ton LineXY() n'a rien à voir : il n'existe pas dans ton code. T'as oublié de typer, et pis c'est tout. Rien de grave. Ça se voit que vous avez le temps pour déconner.
Page sauvegardée.
Code : Tout sélectionner
VirguleFlottanteObligatoire.D = Cos(AnglePareil.D) * DemiAmplitudeOSEF + MoyenneOSEF
(OSEF = On s'en fout du type numérique)
Re: [Résolu] Placer des points sur un cercle
Publié : ven. 11/sept./2020 9:33
par falsam
Ollivier a écrit :T'as oublié de typer, et pis c'est tout.
Je n'ai rien oublié du tout. Par défaut le typage est de type Integer et c'est ce dont j'ai besoin !!!
Ollivier a écrit :Ça se voit que vous avez le temps pour déconner.
Ca se voit que tu as du temps pour chercher la petite bête là ou il y en a pas ! Et je suis poli !
Ollivier a écrit :Ton LineXY() n'a rien à voir : il n'existe pas dans ton code.
La suite de mon code est sur ce topic
https://www.purebasic.fr/french/viewtop ... 59#p208759
J'utilise cette fonction pour tracer des lignes entres des points du cercle. Je pense que le débat sur ce soit disant typage oublié est clos.
JE N'AI PAS BESOIN DE TYPAGE DE TYPE FLOAT DANS CE CODE ! PAR DÉFAUT LE TYPAGE D'UNE VARIABLE EST DE TYPE INTEGER.