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

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

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.

Code : Tout sélectionner

Define.D X, Y, XC, YC
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 :wink:

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 !!! :twisted:
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.