[Résolu] Placer des points sur un cercle

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

[Résolu] Placer des points sur un cercle

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: Placer des points sur un cercle

Message 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
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Placer des points sur un cercle

Message 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 ......
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Placer des points sur un cercle

Message par falsam »

C'est parfait merci beaucoup. Sujet résolu. i'm happy 8)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [Résolu] Placer des points sur un cercle

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: [Résolu] Placer des points sur un cercle

Message 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:
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
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [Résolu] Placer des points sur un cercle

Message par Micoute »

Dans ce cas, il n'est pas le seul.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [Résolu] Placer des points sur un cercle

Message 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).
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: [Résolu] Placer des points sur un cercle

Message 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 
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [Résolu] Placer des points sur un cercle

Message 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
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: [Résolu] Placer des points sur un cercle

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [Résolu] Placer des points sur un cercle

Message 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:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [Résolu] Placer des points sur un cercle

Message 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
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [Résolu] Placer des points sur un cercle

Message 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)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [Résolu] Placer des points sur un cercle

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre