Math en s'amusant

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 :

Math en s'amusant

Message par falsam »

Ici pas de bidouille. Parce que tout le monde (y compris moi) n'a pas forcément une formation mathématique. Vous trouverez quelques formules mathématiques du plus simple au plus compliqué pour vos développements 2D et 3D.

L'objectif n'est pas de montrer des applications complètes. Uniquement des codes courts avec une seule fonctionnalités à mettre en évidence.

J'espére la participation de tous.

2D
- Milieu d'un segment de droite [A B] *
- Distance entre deux points A et B *
- Angle d'un segment de droite [A B] *
- Déplacement d'un point C sur un segment de droite [A B] **
- Dessiner des points (ou autre chose) sur le périmètre d'un cercle. *
- Point d'intersection de deux segments de droite * - Auteur Patrick88
- De quel cotés d'un segment [A B] se trouve un point C ? * - Auteur Patrick88
- Déplacer un point C perpendiculairement à un segment [A B] * - Auteur Patrick88

3D


:idea: Et aussi . . .
- Formules mathématiques (géométrie 2D)
- Dessines moi un arbre fractal.
- Game Math (Forum anglophone)

:idea: Plutôt que d'utiliser la structure native Point, utilisez à la place une structure float.

Code : Tout sélectionner

;Remplace la structure native Point
Structure Vector
  x.f ;Position x
  y.f ;Position y
EndStructure

Légende
* Débutant - ** Intermédiaire - *** Expert


Ce premier message sera mise à jour par les modérateurs de ce forum au fur et à mesure de vos propositions
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Math en s'amusant

Message par falsam »

Milieu d'un segment de droite [A B]

Code : Tout sélectionner

;falsam - Milieu d'un segment de droite [A B]

;Niveau de difficulté : *

Enumeration Window
  #MainForm
EndEnumeration

Enumeration Gadget
  #Grid
EndEnumeration

Global Margin = 6

;Remplace la structure native Point
Structure Vector
  x.f ;Position x
  y.f ;Position y
EndStructure

;Point A & B & C (Milieu de [A, B]
Global A.Vector, B.Vector, *C.Vector

Declare Mid2DPoint(*P1.Vector, *P2.Vector)

OpenWindow(#MainForm, 0, 0, 400, 400, "Milieu d'un segment de droite [A,B]", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)      
CanvasGadget(#Grid, 0, 0, 400, 400)

;Définition du point A
A\x = 100
A\y = 100

;Définition du point B
B\x = 300
B\y = 300


StartDrawing(CanvasOutput(#Grid))
DrawingMode(#PB_2DDrawing_Transparent)

;Placement du point A
Circle(A\x, A\y, 2, RGB(255, 0, 0))
DrawText(A\x + Margin, A\y - Margin*2, "A", RGB(0, 0, 0))

;Placement du point B
Circle(B\x, B\y, 2, RGB(255, 0, 0))
DrawText(B\x + Margin, B\y - Margin*2, "B", RGB(0, 0, 0))

;Ligne entre A et B
LineXY(A\x, A\y, B\x, B\y, RGB(0, 0, 0))

;Placement du point C milieu de [A, B]
*C = Mid2DPoint(A, B)

Circle(*C\x, *C\y, 2, RGB(255, 0, 0))
DrawText(*C\x + Margin, *C\y - Margin*2, "C", RGB(0, 0, 0))

StopDrawing()

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow

;Retourne le miieu de deux vecteurs (Points 2D)
Procedure Mid2DPoint(*P1.Vector, *P2.Vector)
  Protected *Result.Vector = AllocateMemory(SizeOf(Vector))

  *Result\x = (*P1\x + *P2\x) / 2.0
  *Result\y = (*P1\y + *P2\y) / 2.0

  ProcedureReturn *Result
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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Math en s'amusant

Message par falsam »

Distance entres deux points A et B

Code : Tout sélectionner

;falsam - Distance entres deux points A et B

;Niveau de difficulté : *


;Remplace la structure native Point
Structure Vector
  x.f ;Position x
  y.f ;Position y
EndStructure

Procedure.f Distance(*p.Vector, *q.Vector)
  Protected Distance.d, dx.d, dy.d
  
  ;Distance horizontale
  dx = *p\x - *q\x   
  
  ;Distance verticale
  dy = *p\y - *q\y
  
  ;Théoréme de Pythagore
  Distance = Sqr(dx*dx + dy*dy )
  
  ProcedureReturn Distance
EndProcedure

;Définition du point A
A.Vector
A\x = 3
A\y = 2

;Définition du point B
B.point 
B\x = 7
B\y = 8

Debug "Distance entre A et B " + Distance(A, B)
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 :

Angle d'un segment de droite [A B]

Message par falsam »

Angle d'un segment de droite [A B]

Objectif : Afficher un sprite au milieu d'un segment [A B]. Ce sprite aura un angle de rotation identique à celui du segment de droite [A, B]

Code : Tout sélectionner

;falsam - Angle d'un segment de droite [A B]

;Niveau de difficulté : *

;Structure d'un vecteur
Structure Vector
  x.f ;Position x
  y.f ;Position y
EndStructure

;Points A, B et *C
Global A.Vector, B.Vector, *C.Vector

;Afficher un texte
Global SpriteText, Buffer.s = "Milieu de [A B]", TextWidth, TextHeight

;Marge affichage texte
Global Margin = 6

;Plan de l'application
Declare GameStart()
Declare GameUpdate()
Declare GameEnd()

;Math
Declare.i Mid2DPoint(*P1.Vector, *P2.Vector)
Declare.f Angle2DPoint(*p1.Vector, *p2.Vector)
GameStart()

Procedure GameStart()
  If InitSprite()
    InitKeyboard()
    InitMouse()
    
    ;Définition du point A
    A\x = 400
    A\y = 300
    
    ;Définition du point B
    B\x = 500
    B\y = 500   
    
    ;Calcul du point C milieu de [A,B]
    *C = Mid2DPoint(A, B)
    
    OpenWindow(0, 0, 0, 800, 600, "Jeu de Math : Angle d'un segment [A B]", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    BindEvent(#PB_Event_CloseWindow, @GameEnd())
    
    OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
    
    ;Creation du sprite text à afficher
    SpriteText = CreateSprite(#PB_Any, 120, 24, #PB_Sprite_AlphaBlending)
    StartDrawing(SpriteOutput(SpriteText))
      TextWidth  = TextWidth(Buffer)
      textHeight = TextHeight(Buffer)
      
      ;Fond
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(0, 0, 120, 24, RGBA(0, 0, 0, 0))
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      RoundBox(0, 0, 120, 24, 6, 6, RGBA(218, 165, 32, 255))
      
      ;Text
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText((120 - TextWidth)/2, (24 - TextHeight)/2, Buffer, RGBA(0, 0, 0, 255))
      
      ;Contour
      DrawingMode(#PB_2DDrawing_Outlined)
      RoundBox(0, 0, 120, 24, 6, 6, RGBA(0, 0, 0, 255))
    StopDrawing()
     
    GameUpdate()
  Else
    GameEnd()
  EndIf
EndProcedure

Procedure GameUpdate()
  Repeat : Repeat : Until WindowEvent() = 0
    ClearScreen(RGB(192, 192, 192))
    
    ;Affichage des point A et B
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    
    ;Affichage point A
    Circle(A\x, A\y, 2, RGB(255, 0, 0))
    DrawText(A\x - Margin*2, A\y - Margin*2, "A", RGB(0, 0, 0))
    
    ;Affichage point B
    Circle(B\x, B\y, 2, RGB(255, 0, 0))
    DrawText(B\x + Margin, B\y - Margin*2, "B", RGB(0, 0, 0))
    
    ;Ligne entre A et B
    LineXY(A\x, A\y, B\x, B\y, RGB(0, 0, 0))
    
    StopDrawing()
    
    ;Affichage point C milieu de [A B]
    DisplayTransparentSprite(SpriteText, *C\x - SpriteWidth(SpriteText)/2, *C\y - SpriteHeight(SpriteText)/2)
    RotateSprite(SpriteText, Angle2DPoint(B, A), #PB_Absolute)
    
    ExamineKeyboard()
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

Procedure GameEnd()
  End
EndProcedure

;Retourne le milieu de deux vecteurs (Points 2D)
Procedure.i Mid2DPoint(*P1.Vector, *P2.Vector)
  Protected *Result.Vector = AllocateMemory(SizeOf(Point))
  
  *Result\x = (*P1\x + *P2\x) / 2.0
  *Result\y = (*P1\y + *P2\y) / 2.0
  
  ProcedureReturn *Result
EndProcedure

;Retourne l'angle entre deux vecteurs 2D 
Procedure.f Angle2DPoint(*p1.Vector, *p2.Vector)
  ProcedureReturn ATan2((*p2\x - *p1\x), (*p2\y - *p1\y) ) * 180 / #PI + 180
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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Déplacement d'un point C sur un segment de droite [A B]

Message par falsam »

Déplacement d'un point C sur un segment de droite [A B]

Code : Tout sélectionner

;falsam - Déplacement d'un point C sur un segment de droite A B

;Niveau de difficulté : **

EnableExplicit

;Structure d'un vecteur 2D
Structure newVector
  x.f
  y.f
EndStructure

;Point A, B, C 
Global A.newVector, B.newVector, C.newVector

;Distance et vitesse de déplacement
Global Distance.f, Speed.f = 10

;Nombre d'iterations à effectuer pour aller de A à B
Global N.f

Declare.d Distance(*p.Point, *q.Point)

;Définition du point A
A\x = 100
A\y = 100

;Définition du point B
B\x = 700
B\y = 400

;Point de départ du point C
C\x = 100
C\y = 100

;Distance entre les points B et A
Distance = Distance(A, B)

;En divisant la distance par la variable Speed on obtient la durée 
;Cette durée correspondra au nombre "N" d'itérations à effectuer
N = Sqr(Distance) / Speed

;Diviser la distance horizontale par le nombre d'itérations pour savoir combien de pixels on ajoute à X à chaque itération, idem pour Y.
Global Dx.f = (B\x - A\x) / N
Global Dy.f = (B\y - A\y) / N

;Initialisation
If InitSprite()
  InitKeyboard()
  InitMouse()
EndIf

;Creation du screen
OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)

Repeat
  Repeat : Until WindowEvent() = 0  
  
  StartDrawing(ScreenOutput())
  
  ;Placement du point A
  Circle(A\x, A\y, 2, RGB(255, 0, 0))
  
  ;Placement du point B
  Circle(B\x, B\y, 2, RGB(255, 0, 0))
  
  ;Ligne entre A et B
  LineXY(A\x, A\y, B\x, B\y, RGB(0, 0, 0))
  
  ;Deplacement du point C
  Circle(C\x, C\y, 5, RGB(0, 0, 0))
  
  StopDrawing()
  
  ;Déplacement du point C entre A et B
  If C\x < B\x Or C\y < B\y
    C\x = C\x + Dx
    C\y = C\y + Dy
  EndIf
  
  FlipBuffers()
  ClearScreen(RGB(135, 206, 235))
  ExamineKeyboard()
  
Until KeyboardPushed(#PB_Key_Escape)

Procedure.d Distance(*p.Point, *q.Point)
  Protected Distance.d, dx.d, dy.d
  
  ;Distance horizontale
  dx = *p\x - *q\x   
  
  ;Distance verticale
  dy = *p\y - *q\y
  
  ;Théoréme de Pythagore
  Distance = Sqr(dx*dx + dy*dy )
  
  ProcedureReturn Distance
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
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Math en s'amusant

Message par Micoute »

Simple et efficace, j'adore et j'adhère. Merci pour le partage.
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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Dessiner des points sur un cercle

Message par falsam »

Dessiner des points sur le périmètre d'un cercle

Je me souviens d'un topic de Micoute qui cherchait à dessiner des points sur un cercle pour coder une horloge.

J'ai repris ce principe pour dessiner des points sur un cercle.

Code : Tout sélectionner

;falsam - Tracé de points sur un cercle

;Niveau de difficulté : *

Enumeration Window
  #mainForm
EndEnumeration

Enumeration Gadget
  #Canvas  
EndEnumeration

;Centre X et Y d'un cercle
Global CX = 400
Global CY = 300

;Rayon du cercle
Global Radius.i = 150

;Plan de l'application
Declare Start()
Declare Draw()
Declare Exit()

Start()

Procedure Start()
  OpenWindow(#mainForm, 0, 0, 800, 600, "Point tournant autour d'un cercle", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(#Canvas, 0, 0, 800, 600)
  
  Draw()
  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure Draw()
  Static Angle    ;Angle variant de 0 à 360 Degrés
  Protected X, Y  ;Coordonnées X, Y du point circulant sur le cercle
  
  StartDrawing(CanvasOutput(#Canvas))
  
  ;L'angle varie de 0 à 360 Degrés incrémenté + 10
  For Angle = 0 To 360 Step 10 
    
    ;Point central du cercle en rouge
    Circle(CX, CY, 5, RGB(255, 0, 0)) 
    
    ;Dessin du cercle
    DrawingMode(#PB_2DDrawing_Default)
    
    ;Nouvelles coordonnées X & Y du point 
    X = CX + Radius * Cos(Angle * #PI / 180)
    Y = CY + Radius * Sin(Angle * #PI / 180)
    
    ;Dessin du point
    Circle(X, Y, 3, RGB(0, 0, 0))
  Next
  
  StopDrawing()  
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
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Math en s'amusant

Message par Micoute »

@ falsam, continue sur ta lancée, tous ces exercices ravivent ma mémoire. Merci pour le partage.
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
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Math en s'amusant

Message par MLD »

Une petite appli rapide par expl pour fabriquer une figure d'attente

Code : Tout sélectionner

;falsam - Tracé de points sur un cercle
;appli MLD
;Niveau de difficulté : *

Enumeration Window
  #mainForm
EndEnumeration

Enumeration Gadget
  #Canvas 
EndEnumeration

;Centre X et Y d'un cercle
Global CX = 400
Global CY = 300

;Rayon du cercle
Global Radius.i = 150
Global Maxangle 

;Plan de l'application
Declare Start()
Declare Draw()
Declare Exit()

Start()

Procedure Start()
  OpenWindow(#mainForm, 0, 0, 800, 600, "Point tournant autour d'un cercle", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(#Canvas, 0, 0, 800, 600)
  AddWindowTimer(0, 1, 100)
  BindEvent(#PB_Event_Timer,@Draw())
  BindEvent(#PB_Event_CloseWindow, @Exit())
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure Draw()
  Static Angle    ;Angle variant de 0 à 360 Degrés
  Protected X, Y  ;Coordonnées X, Y du point circulant sur le cercle
  maxangle = maxangle + 30
  If maxangle > 360 :maxangle = 0:EndIf
  StartDrawing(CanvasOutput(#Canvas))
  ;L'angle varie de 0 à 360 Degrés incrémenté + 10
   For Angle = 0 To maxangle Step 10
   ;Dessin du cercle
    DrawingMode(#PB_2DDrawing_Default)
   ;Nouvelles coordonnées X & Y du point
    X = CX + Radius * Cos(Angle * #PI / 180)
    X2 = CX + Radius * Cos((Angle-30) * #PI / 180)
    Y = CY + Radius * Sin(Angle * #PI / 180)
    Y2 = CY + Radius * Sin((Angle-30) * #PI / 180)
    ;Dessin du point
    Circle(X, Y, 3, RGB(0, 0, 0))
    Circle(X2, Y2, 3, RGB(255, 255, 255))
  Next
  StopDrawing()
EndProcedure

Procedure Exit() 
  End
EndProcedure
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Math en s'amusant

Message par falsam »

Bien cette boucle d'attente et pratique quand on a un code un peu long à s'initialiser comme de la 3D par exemple. A faire surement tourner dans un thread. Merci MLD.
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: Math en s'amusant

Message par Micoute »

Merci MLD pour le partage.
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
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Math en s'amusant

Message par Micoute »

Ma petite contribution.

Code : Tout sélectionner

;Fonctions géomètriques

; Déterminer la distance entre deux points
Procedure.s Distance_Entre_2_Points(X1.f, Y1.f, X2.f, Y2.f) 
  Protected a.f, b.f 
  a = X2 - X1 
  b = Y2 - Y1 
  
  ProcedureReturn StrF(Sqr((a * a) + (b * b)), 2)
EndProcedure 

; Déterminer l'angle entre deux points et l'axe des X (dans le système de coordonnées)
Procedure.f Angle_Entre_2_points(X1.f, Y1.f, X2.f, Y2.f) 
  Protected w.f 
  Angle = ATan((Y2 - Y1) / (X2 - X1)) * 57.295776 
  If X2 < X1 
    Angle = 180 + Angle 
  EndIf 
  If Angle < 0 : Angle + 360 : EndIf 
  If Angle > 360 : Angle - 360 : EndIf 
  
  ProcedureReturn Angle 
EndProcedure 

; Déterminer l'angle d'une pente en %
Procedure.f Angle_pente(Longueur.f, Hauteur.f)
  Protected.f Pente
  Pente = Hauteur / Longueur * 100
  ProcedureReturn Pente
EndProcedure

; Déterminer la longueur d'une pente
Procedure.s Longueur_pente(Longueur.f, Hauteur.f)
  Protected.f LP = Sqr((Longueur*Longueur) + (Hauteur*Hauteur))
  ProcedureReturn StrF(LP,2)
EndProcedure

; Modulo pour les nombres à virgule flottante
Procedure.s ModuloF(a.f, b.f) 
  If b < 0 : b = -b : EndIf 
  If a > 0 
    ProcedureReturn StrF(a - Int(a / b) * b, 2)
  Else 
    ProcedureReturn StrF(b + a - Int(a / b) * b, 2)
  EndIf 
EndProcedure 

; Retourne toujours un angle entre 0 et 360
Procedure.f Mod_Angle(Angle.f) 
  If Angle >= 360 
    ProcedureReturn Angle - Int(Angle / 360) * 360 
  ElseIf Angle < 0 
    ProcedureReturn 360 + Angle - Int(Angle / 360) * b 
  Else 
    ProcedureReturn Angle 
  EndIf 
EndProcedure 

; Retourne la proportion de 2 nombres
Procedure.f Proportion(NbDebut.f, NbFin)
  Protected Resultat.f = (NbFin * 100) / NbDebut
  ProcedureReturn Resultat
EndProcedure

; Retourne la quantité recalculée.
Procedure.f QteProportionnelle(NbRef.f, QteRef.f, NbChoisi.f)
  Protected Resultat.f = (NbChoisi * QteRef) / NbRef
  ProcedureReturn Round(Resultat, #PB_Round_Nearest)
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  ;{ partie commune 1
  ;- Initialisations
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  Enumeration Fenetres
    #Fenetre_principale
  EndEnumeration
  
  Enumeration Actions
    #Sortie
    #Aucune
    ;Autres
  EndEnumeration
  
  Global Police =FontID(LoadFont(#PB_Any, "FontAwesome", 20, #PB_Font_Bold))
  Global Police2 =FontID(LoadFont(#PB_Any, "FontAwesome", 20, #PB_Font_Bold|#PB_Font_Italic))
  
  ExamineDesktops() : Global  Largeur_Ecran = DesktopWidth(0) , Hauteur_Ecran = DesktopHeight(0) , Profondeur = DesktopDepth(0)
  Global x,y,z,Texte.s, Titre.s = ""
  ;
  ; ouvrir une fenêtre maximisée de la même taille que le bureau et sans bordure
  ;
  h_Fenetre = OpenWindow(#Fenetre_principale, 0, 0, Largeur_Ecran, Hauteur_Ecran, Titre, #PB_Window_BorderLess)
  ;
  ; ouvrir un écran de la même taille que la fenêtre
  ;
  OpenWindowedScreen(h_Fenetre, 0, 0, Largeur_Ecran, Hauteur_Ecran, 0, 0, 0, #PB_Screen_SmartSynchronization)
  ClearScreen($0B5000)
  StartDrawing(ScreenOutput())
  ;}
  ;- début de l'affichage
  DrawingFont(Police)
  DrawingMode(#PB_2DDrawing_Default)
  x = 0 : y = 0 : BackColor(Point(0,0)) 
  
  ;-Début du programme
  
  DrawText(X, Y, "Distance_Entre_2_Points(X1, Y1, X2, Y2)", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "Distance entre 2 points 10,10 et 100,100 = "+Distance_Entre_2_Points(10,10,100,100)); Déterminer la distance entre deux points
  Y + TextHeight(" ")
  Y + TextHeight(" ")
  DrawingFont(Police)
  DrawText(X, Y, "Angle_Entre_2_points()", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "Angle entre 2 points 10,10 et 100,100 = "+Angle_Entre_2_points(10,10,100,100)+" °") ; Déterminer l'angle entre deux points et l'axe des X 
  Y + TextHeight(" ")
  DrawingFont(Police)                                                                                                    ;(dans le système de coordonnées)
  DrawText(X, Y, "Angle_pente(Longueur, Hauteur)", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "Angle d'une pente L = 800, H = 6 = "+Angle_pente(800,6)+" %")                       ; Déterminer l'angle d'une pente en %
  Y + TextHeight(" ")
  
  Y + TextHeight(" ")
  DrawingFont(Police)
  DrawText(X, Y, "Longueur_pente(Longueur, Hauteur)", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "Longueur d'une pente de L = 800, H = 6 = "+Longueur_pente(800,6))                   ; Déterminer la longueur d'une pente
  Y + TextHeight(" ")
  
  Y + TextHeight(" ")
  DrawingFont(Police)
  DrawText(X, Y, "ModuloF(a, b)", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "Reste de la division de 10,5 \ 3,33 = "+ModuloF(10.5,3.33))                         ; Modulo pour les nombres à virgule flottante
  Y + TextHeight(" ")
  
  Y + TextHeight(" ")
  DrawingFont(Police)
  DrawText(X, Y, "Mod_Angle(Angle) l'angle est toujours dans la fourchette 0-360°", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "Modulo angle de 460.5 = "+Mod_Angle(460.5) + " °")                                  ; Retourne toujours un angle entre 0 et 360
  Y + TextHeight(" ")
  
  Y + TextHeight(" ")
  DrawingFont(Police)
  DrawText(X, Y, "Proportion(NbDebut, NbFin)", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "45% des moutons d'un troupeau sont blancs. Le troupeau comporte exactement 72 moutons blancs.")
  Y + TextHeight(" ")
  DrawText(X, Y, "- Le troupeau se compose de " + Proportion(45, 72) + " moutons.", $999EFC)
  Y + TextHeight(" ")
  
  Y + TextHeight(" ")
  DrawingFont(Police)
  DrawText(X, Y, "QteProportionnelle(NbRef, QteRef, NbChoisi)", $FFFF)
  Y + TextHeight(" ")
  DrawingFont(Police2)
  DrawText(X, Y, "Si pour faire 2 tartes j'ai besoin de 250 g de fraises, alors pour faire 3 tartes de combien de grammes de fraises aurai-je besoin ? ")
  Y + TextHeight(" ")
  DrawText(X, Y, "- J'aurai besoin de " + QteProportionnelle(2, 250, 3) + " grammes de fraises.", $FF9797)
  Y + TextHeight(" ")
  DrawText(X, Y, "Si pour faire 3 tartes j'ai besoin de 375 g de fraises, alors pour faire 2 tartes de combien de grammes de fraises aurai-je besoin ? ")
  Y + TextHeight(" ")
  DrawText(X, Y, "- J'aurai besoin de " + QteProportionnelle(3, 375, 2) + " grammes de fraises.", $FF9797)
  Y + TextHeight(" ")
  DrawText(X, Y, "J'ai une recette calculée pour 8 personnes, où il me faut 12 oeufs, combien m'en faut-il pour 3 personnes ?")
  Y + TextHeight(" ")
  DrawText(X, Y, "- Il me faut donc, " + QteProportionnelle(8, 12, 3) + " oeufs.", $FF9797)
  Y + TextHeight(" ")
  
  ;-Fin du programme
  
  ;{ partie commune 2
  ;- fin d'affichage
  StopDrawing()
  ;
  ; montrons les choses sur l'écran
  ;
  FlipBuffers()
  
  ;- gestion des événements en boucle sans fin
  Global action.i = #Aucune
  Repeat
    Global Evenement = WindowEvent()
    Select Evenement
      Case #PB_Event_CloseWindow
        action = #Sortie
      Case 0
        ;
        ; il n'y a pas d'événement, donc faisons nos trucs graphiques
        ExamineKeyboard()
        If KeyboardPushed(#PB_Key_All)
          action = #Sortie
        EndIf
        ExamineMouse()
        If MouseButton(#PB_MouseButton_Left)   <> 0 Or 
           MouseButton(#PB_MouseButton_Middle) <> 0 Or 
           MouseButton(#PB_MouseButton_Right)  <> 0 
          action = #Sortie
        EndIf
    EndSelect
  Until action = #Sortie
  ;- fermeture de l'écran & de la fenêtre en douceur
  CloseScreen()
  CloseWindow(#Fenetre_principale)
  ;}
CompilerEndIf
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
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Math en s'amusant

Message par MLD »

Allez une autre applis pour le fun

Code : Tout sélectionner

;falsam - Tracé de points sur un cercle
;appli MLD
;Niveau de difficulté : *

Enumeration Window
  #mainForm
EndEnumeration

Enumeration Gadget
  #Canvas 
  #canvas2
  #canvas3
  #canvas6
  #canvas7
EndEnumeration

;Centre X et Y d'un cercle
Global CX = 30
Global CY = 30
;Rayon du cercle
Global Radius.i = 25
Global Maxangle 
Global Maxangle2
Global Maxangle3
Global Pospt
Global Pospt2
;Plan de l'application
Declare Start()
Declare Draw()
Declare Draw2()
Declare Draw3()

Declare Draw6()
Declare Draw7()

Declare Exit()

Start()

Procedure Start()
  OpenWindow(#mainForm, 0, 0, 300, 300, "figures d'attente", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowColor(0,$96BACD) 
  CanvasGadget(#Canvas, 10, 10, 60, 60)
  CanvasGadget(#Canvas2, 10, 80, 60, 60)
  CanvasGadget(#Canvas3, 10, 150, 60, 60)
  
  CanvasGadget(#Canvas6, 100,30,100, 8)
  CanvasGadget(#Canvas7, 100,110,100, 8)
  AddWindowTimer(0, 1, 150)
  BindEvent(#PB_Event_Timer,@Draw())
  BindEvent(#PB_Event_Timer,@Draw2())
  BindEvent(#PB_Event_Timer,@Draw3())
  
  BindEvent(#PB_Event_Timer,@Draw6())
  BindEvent(#PB_Event_Timer,@Draw7())
  BindEvent(#PB_Event_CloseWindow, @Exit())
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure Draw()
  Static Angle    ;Angle variant de 0 à 360 Degrés
  Protected X, Y  ;Coordonnées X, Y du point circulant sur le cercle
  maxangle = maxangle + 20
  If maxangle > 360 :maxangle = 0:EndIf
  StartDrawing(CanvasOutput(#Canvas))
  Box(0,0,60,60,GetWindowColor(0))
  ;L'angle varie de 0 à 360 Degrés incrémenté + 10
   For Angle = 0 To maxangle Step 30
   ;Dessin du cercle
    DrawingMode(#PB_2DDrawing_Default)
   ;Nouvelles coordonnées X & Y du point
    X = CX + Radius * Cos(Angle * #PI / 180)
    X2 = CX + Radius * Cos((Angle-30) * #PI / 180)
    Y = CY + Radius * Sin(Angle * #PI / 180)
    Y2 = CY + Radius * Sin((Angle-30) * #PI / 180)
    ;Dessin du point
    Circle(X, Y, 3,$32CD32)
    Circle(X2, Y2, 3,$D7EBFA)
  Next
  StopDrawing()
EndProcedure
Procedure Draw2()
  Static Angle    ;Angle variant de 0 à 360 Degrés
  Protected X, Y  ;Coordonnées X, Y du point circulant sur le cercle
  maxangle2 = maxangle2 - 20
  If maxangle2 < 0 :maxangle2 = 360:EndIf
  StartDrawing(CanvasOutput(#Canvas2))
  Box(0,0,60,60,GetWindowColor(0))
  ;L'angle varie de 0 à 360 Degrés incrémenté + 10
   For Angle = 0 To maxangle2 Step 30
   ;Dessin du cercle
    DrawingMode(#PB_2DDrawing_Default)
   ;Nouvelles coordonnées X & Y du point
    X = CX + Radius * Cos(Angle * #PI / 180)
    X2 = CX + Radius * Cos((Angle-30) * #PI / 180)
    Y = CY + Radius * Sin(Angle * #PI / 180)
    Y2 = CY + Radius * Sin((Angle-30) * #PI / 180)
    ;Dessin du point
    Circle(X, Y, 3,$4040FF)
   Next
  StopDrawing()
EndProcedure

Procedure Draw3()
  Static Angle    ;Angle variant de 0 à 360 Degrés
  Protected X, Y  ;Coordonnées X, Y du point circulant sur le cercle
  maxangle3 = maxangle3 + 20
  If maxangle2 >360 :maxangle2 = 0:EndIf
  StartDrawing(CanvasOutput(#Canvas3))
  Box(0,0,60,60,GetWindowColor(0))
  ;L'angle varie de 0 à 360 Degrés incrémenté + 10
   For Angle = 0 To maxangle3 Step 30
   ;Dessin du cercle
    DrawingMode(#PB_2DDrawing_Default)
   ;Nouvelles coordonnées X & Y du point
    X = CX + Radius * Cos(Angle * #PI / 180)
    X2 = CX + Radius * Cos((Angle-30) * #PI / 180)
    Y = CY + Radius * Sin(Angle * #PI / 180)
    Y2 = CY + Radius * Sin((Angle-30) * #PI / 180)
    ;Dessin du point
    Circle(X, Y, 3,$FF0000)
    Circle(X2, Y2, 3,GetWindowColor(0))
  Next
  StopDrawing()
EndProcedure

Procedure Draw6()
 StartDrawing(CanvasOutput(#Canvas6))
  If Pospt = 0:Box(0,0,100,8,GetWindowColor(0)):Pospt = 3:EndIf
  Circle(Pospt, 3, 3,$32CD32);Dessin du point
  If Pospt >100
   Box(0,0,100,8,GetWindowColor(0))
   Pospt = 0
  EndIf
  Pospt = Pospt + 10
 StopDrawing()
EndProcedure

Procedure Draw7()
  StartDrawing(CanvasOutput(#Canvas7))
  Box(0,0,100,8,GetWindowColor(0))
  If Pospt2 = 0:Pospt2 = 3:EndIf
  Circle(Pospt2, 3, 3,$0000FF);Dessin du point
  Circle(Pospt2 -7, 3, 3,GetWindowColor(0))
 If Pospt2 >107
   Pospt2 = 0
 EndIf
 Pospt2 = Pospt2 + 7
  StopDrawing()
EndProcedure

Procedure Exit() 
  End
EndProcedure
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Dessiner des points sur un cercle

Message par Zorro »

falsam a écrit :
Je me souviens d'un topic de Micoute qui cherchait à dessiner des points sur un cercle pour coder une horloge.
ben il a pas du chercher bien longtemps
ci dessous un code posté par "Dobro" le posté le 26/08/2004 a 15:01 (purée deja 13 ans !! ) :mrgreen:

sans parler du nombre de code "Horloge" qui ont été posté par pleins de membres :)

Code : Tout sélectionner


; code by Dobro
; posté le 26/08/2004 a 15:01
#dobro=1
#Police=1
#Sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,"hello",  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
WindowID = WindowID(1)

Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
Resultat = InitMouse()
taille_du_cercle=200
nombre_de_point=360 ; ceci determine la resolution (nombre de points)
Repeat
    ExamineMouse()
    Event=WaitWindowEvent(2)
   
    StartDrawing( ScreenOutput()) 
    compt+1 
    If compt=nombre_de_point :compt=0:EndIf ; on a fait le tour ??
   
    x=taille_du_cercle* Cos( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2) ; la formule du cercle /360 = 360 points
    y=taille_du_cercle * Sin( compt*(2*3.1415926/nombre_de_point)) + (EcranY  / 2) ; la formule du cercle
    Box(x, y,2, 2 ,RGB(255,255,255))
    
    StopDrawing()
    FlipBuffers():; affiche l'ecran
    Event=WindowEvent()
    If MouseButton(2)
        End
    EndIf
Until Event=#PB_Event_CloseWindow  

petit détournement pour les vicelards ...

Code : Tout sélectionner


; code by Dobro http://michel.dobro.free.fr/
#dobro=1
#Police=1
#Sprite=1
; ***********************************
resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered ) 
    WindowID = WindowID(1) 
    result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
    resultat = InitMouse() 
    taille_du_cercle=20
    nombre_de_point=360 ; ceci determine la resolution (nombre de points)
    Repeat
        ExamineMouse() 
        Event=WaitWindowEvent(2)
        
        StartDrawing( ScreenOutput())  
        compt+1  
        If compt=nombre_de_point :compt=0:EndIf ; on a fait le tour ?? 
        
        x=taille_du_cercle* Cos( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2) ; la formule du cercle /360 = 360 points
        y=taille_du_cercle * Sin( compt*(2*3.1415926/nombre_de_point)) + (EcranY  / 2) ; la formule du cercle
        Box(x, y,2, 2 ,RGB(255,255,255))
        taille_du_cercle+Sin( compt*(2*3.1415926/nombre_de_point))+Cos( compt*(2*3.1415926/nombre_de_point))  
        StopDrawing()  
        FlipBuffers():; affiche l'ecran 
        
        If  compt=300
            StartDrawing( ScreenOutput())   
                  DrawText(EcranX/2, EcranY/2+150,"he he he.")
            StopDrawing()  
            FlipBuffers():; affiche l'ecran 
        EndIf 
        Event=WindowEvent() 
        If MouseButton(2)
            End
        EndIf
Until Event=#PB_Event_CloseWindow 
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Math en s'amusant

Message par Micoute »

@MLD Je trouve ça très original, merci pour la partage.

@Zorro Très bien ta courbe cardio, il faut avoir des idées bizarres pour trouver ça vicelard.
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 !
Répondre