PureBasic

Forums PureBasic
Nous sommes le Jeu 21/Nov/2019 20:46

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 47 messages ]  Aller à la page 1, 2, 3, 4  Suivante
Auteur Message
 Sujet du message: Math en s'amusant
MessagePosté: Sam 03/Mar/2018 16:36 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6857
Localisation: IDF (Yvelines)
Ici pas de bidouille. Parce que tout le monde 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:
;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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Sam 03/Mar/2018 16:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6857
Localisation: IDF (Yvelines)
Milieu d'un segment de droite [A B]

Code:
;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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Sam 03/Mar/2018 16:42 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6857
Localisation: IDF (Yvelines)
Distance entres deux points A et B

Code:
;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)

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Angle d'un segment de droite [A B]
MessagePosté: Sam 03/Mar/2018 16:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6857
Localisation: IDF (Yvelines)
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:
;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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Déplacement d'un point C sur un segment de droite [A B]
MessagePosté: Sam 03/Mar/2018 17:28 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6857
Localisation: IDF (Yvelines)
Déplacement d'un point C sur un segment de droite [A B]

Code:
;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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Sam 03/Mar/2018 17:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2203
Localisation: 50200 Coutances
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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Dessiner des points sur un cercle
MessagePosté: Sam 03/Mar/2018 22:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6857
Localisation: IDF (Yvelines)
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:
;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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Dim 04/Mar/2018 11:03 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2203
Localisation: 50200 Coutances
@ 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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Dim 04/Mar/2018 11:47 
Hors ligne

Inscription: Jeu 05/Fév/2009 17:58
Messages: 923
Une petite appli rapide par expl pour fabriquer une figure d'attente
Code:
;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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Dim 04/Mar/2018 12:03 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6857
Localisation: IDF (Yvelines)
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.

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Dim 04/Mar/2018 15:34 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2203
Localisation: 50200 Coutances
Merci MLD pour le partage.

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Dim 04/Mar/2018 15:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2203
Localisation: 50200 Coutances
Ma petite contribution.

Code:
;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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Lun 05/Mar/2018 16:36 
Hors ligne

Inscription: Jeu 05/Fév/2009 17:58
Messages: 923
Allez une autre applis pour le fun
Code:
;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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Dessiner des points sur un cercle
MessagePosté: Lun 05/Mar/2018 17:33 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2106
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:

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

; 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"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Lun 05/Mar/2018 17:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2203
Localisation: 50200 Coutances
@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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 47 messages ]  Aller à la page 1, 2, 3, 4  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 5 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye