Page 4 sur 5

Re: Math en s'amusant

Publié : sam. 17/mars/2018 23:12
par Ollivier
Super, PAPIPP !

J'avais besoin de 30 secondes de détente, pour me remettre d'une charge de données à traiter qui ne cesse. Et j'ai apprécié ces jeux de mots.

Pi est impressionnant. Pendant des siècles, sa précision s'est faite impénétrable, puis les difficultés de son calcul ont été pulvérisées dans les années 80, bien que Pi reste infini.

Re: Math en s'amusant

Publié : sam. 31/mars/2018 17:21
par Kwai chang caine
MC PAPIPP a écrit :Certes le PIs est imbuvable mais ce qui en sort l’est (lait)
Vous allez de mal en Pis. Elève Kcc vous serez au Piquet.
Certains disent que le PIment.
Je ne le crois pas car si le Pirate pour vous c’est à cause de vos Pirouettes.

De toutes manières au Pifomètre le Pivot 3,14.
Le PIlier aux nombres complexes n’est pas un PIs-aller (pis à lait) il n’est donc pas vache.

Merci KCC.

A+
:D Top cool !!!! :lol: :lol: :lol:
Pappip's Delight a écrit :Je ne le crois pas car si le Pirate
Moi j'ai pas assez intelligent pour savoir si le PIrate :oops:
Mais aprés c'que j'viens d'lire...j'ai sûr que le paPIpp rap !!! yo !!!! :mrgreen: :lol:


ImageImage


Merci plutôt à toi MAITRémathique 8)

Re: Math en s'amusant

Publié : dim. 19/avr./2020 11:03
par Patrick88
Dessin d'un cercle passant par 3 points définit "au hasard",
source Cercle passant par 3 points (Obs. Lyon - phm - 2006/02/05 - cercle_3pts.wpd)
https://cral-perso.univ-lyon1.fr/labo/f ... e_3pts.pdf

Falsam, je n'ai pas réussi en utilisant ton fond de code je te laisse le plaisir de convertir "à ta sauce"...
code utilisant la lib VectorDrawing, rien de bien sorcier, mais je comprends ce que je fait...

ça faisait perpet de temps (code pondu en octobre 2019) que je n'avais pas utilisé purebasic.
et afin de relancer le sujet un peu spamé par des bots chinois...

Pat

Code : Tout sélectionner

#Fen1 = 0
#Fen1_Canvas1 = 0
#Fen1_Font1 = 0
#FontSize = 12
#Margin = 6 ;Marge affichage texte
#NbSegmentPolygon = 12
#FontName2 = "Monotype Corsiva"
#FontName1 = "Arial"

; sinus = axe des Y
; cosinus = axe des X
; angle d'un point d'un cercle par rapport à son centre
; angle = Arcsin(x) ou  Arccos(x)

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

;Points A, B et *pt
Global A.Vector, B.Vector, C.Vector, D.Vector, *pt.vector
Global *M1.Vector, *M2.vector ; milieu des segment [A B] et [B C]

;Afficher un texte
Global SpriteGauche,SpriteDroit, Buffer.s, TextWidth, TextHeight

;Marge affichage texte
Global Margin = 6,LargeuDeLaLigne.d=1

;{ Macro Trace() extension de la fonction debug de purebasic
;  par G-Rom Dim Juin 12, 2016
;  http://www.purebasic.fr/french/viewtopic.php?f=1&t=16107
;
	Macro Quote 
	  "
	EndMacro 
	 
	Macro Trace(name) 
		Debug "Line : " + Str(#PB_Compiler_Line) + " Name = "+Quote#name#Quote+ " Value = " + name 
	EndMacro 
	;}
	
	Procedure DessinePoint(*P1.Vector, texte.s)
    ; dessin du point
	  StrokePath(LargeuDeLaLigne)
	  AddPathCircle(*p1\x, *p1\y, 2)
	  VectorSourceColor(RGBA(255, 0, 0, 255))
	  VectorFont(FontID(#Fen1_Font1))
	  ClosePath()     
	  
	  ; libellé du point
	  StrokePath(LargeuDeLaLigne)
    MovePathCursor(*p1\x - Margin*2, *p1\y - Margin*2)
    AddPathText(Texte)
    VectorSourceColor(RGBA(0, 0, 0, 255))
    ClosePath()
    
EndProcedure
  
Procedure DessineCerclePassantPar3Point(*P1.Vector,*P2.Vector,*P3.Vector)

  ;B5 = x1  *p1\x 
  ;C5 = y1  *p1\y
  ;D5 = x2  *p2\x 
  ;E5 = y2  *p2\y
  ;F5 = x3  *p3\x 
  ;G5 = y3  *p3\y
  ;H5 = xc  
  ;i5 = yc
  ;j5 = RC
  ; point x du centre : xc =((F5,2-D5,2+G5,2-E5,2)/(2*(G5-E5))-(D5,2-B5,2+E5,2-C5,2)/(2*(E5-C5)))/((F5-D5)/(G5-E5)-(D5-B5)/(E5-C5))
  ; point y du centre : yc =-(D5-B5)/(E5-C5)*H5+(D5,2-B5,2+E5,2-C5,2)/(2*(E5-C5))
  ; rayon du cercle : rc =RACINE((B5-H5),2+(C5-I5),2)
  Protected B5.d,C5.d,D5.d,E5.d,F5.d,G5.d,H5.d,i5.d,j5.d
  Protected PtCentre.Vector
  B5 = *p1\x 
  C5 = *p1\y
  D5 = *p2\x 
  E5 = *p2\y
  F5 = *p3\x 
  G5 = *p3\y
  
  H5 = ((Pow(F5,2)-Pow(D5,2)+Pow(G5,2)-Pow(E5,2))/(2*(G5-E5))-(Pow(D5,2)-Pow(B5,2)+Pow(E5,2)-Pow(C5,2))/(2*(E5-C5)))/((F5-D5)/(G5-E5)-(D5-B5)/(E5-C5))
  i5 = -(D5-B5)/(E5-C5)*H5+(Pow(D5,2)-Pow(B5,2)+Pow(E5,2)-Pow(C5,2))/(2*(E5-C5))
  j5 = Sqr(Pow((B5-H5),2)+Pow((C5-I5),2))
  
  PtCentre\x = H5 
  PtCentre\y = i5
  DessinePoint(PtCentre,"")
  

  AddPathCircle(H5, i5, j5)
  VectorSourceColor(RGBA(255, 0, 0, 255))
  StrokePath(LargeuDeLaLigne)
  ClosePath() 
  
  ;  longueur L d’un arc de cercle = angle en radian * rayon
  
EndProcedure
  
If OpenWindow(0, 0, 0, 800, 600, "Jeu de Math : Dessine un segment d'arc par 3 points",  #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CanvasGadget(#Fen1_Canvas1, 0,0, WindowWidth(#Fen1), WindowHeight(#Fen1))
  LoadFont(#Fen1_Font1, #FontName1, #FontSize)

  ;Définition du point A
    A\x = 100
    A\y = 300
   
    ;Définition du point B
    B\x = 300
    B\y = 50   
   
    ;Définition du point C
    C\x = 570
    C\y = 400
      

    If StartVectorDrawing(CanvasVectorOutput(#Fen1_Canvas1))
      
;       ;Affichage les points A B C
      DessinePoint(A,"A")
      DessinePoint(B,"B")
      DessinePoint(C,"C")

      DessineCerclePassantPar3Point(A,B,C)
    
      StopVectorDrawing()
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


Re: Math en s'amusant

Publié : dim. 19/avr./2020 15:57
par Ar-S
Petite variante du code de MLD

Code : Tout sélectionner

;falsam - Tracé de points sur un cercle
;appli MLD
;Niveau de difficulté : *
; apparition/disparition des dots : Ar-S

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,color

;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 + 30
  If maxangle > 360 : maxangle = 0
    If color = 0 : color = $FFFFFF
    Else
      color = 0
    EndIf
  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, color)

  Next
  StopDrawing()
EndProcedure

Procedure Exit()
  End
EndProcedure

Re: Math en s'amusant

Publié : lun. 20/avr./2020 14:05
par Micoute
c'est mieux avec:

Code : Tout sélectionner

For Angle = - 90 To maxangle - 90 Step 10

Déplacement d'un point C sur une suite de segment de droite

Publié : dim. 24/oct./2021 17:11
par Thyphoon
Ma petite contribution ...
Pour se deplacer sur un chemin constitué de plusieurs segments en ne connaissant que la distance sur ce chemin :P

Code : Tout sélectionner

EnableExplicit

  Procedure.f distanceBetwenPoint(x1, y1, x2, y2)
    ProcedureReturn Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
  EndProcedure


If InitSprite()
  InitKeyboard()
  InitMouse()
EndIf

OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)

Structure p
  x.f
  y.f
EndStructure

;Path
NewList Path.p()
AddElement(path()):path()\x=10:path()\y=10
AddElement(path()):path()\x=50:path()\y=30
AddElement(path()):path()\x=60:path()\y=45
AddElement(path()):path()\x=80:path()\y=80
AddElement(path()):path()\x=120:path()\y=90
AddElement(path()):path()\x=150:path()\y=150
AddElement(path()):path()\x=250:path()\y=300
AddElement(path()):path()\x=300:path()\y=250
AddElement(path()):path()\x=500:path()\y=100
AddElement(path()):path()\x=600:path()\y=50
AddElement(path()):path()\x=750:path()\y=500
AddElement(path()):path()\x=100:path()\y=300

Define.l Distance=0


Define.l n,x1,x2,y1,y2,hypothenus,OldPathDistance,PathDistance,SegmentDistance
Define Target.p

Repeat
  Repeat : Until WindowEvent() = 0  
  
  
  Distance=Distance+5
  
  
  
  StartDrawing(ScreenOutput())
  PathDistance=0
  For n=0 To ListSize(Path())-1
      SelectElement(Path(),n)
      x1=Path()\x
      y1=Path()\y
      If SelectElement(Path(),n+1)
        x2=Path()\x
        y2=Path()\y
        ;Calcul Path Distance
        OldPathDistance=PathDistance
        hypothenus=distanceBetwenPoint(x1, y1, x2, y2)
        PathDistance=PathDistance+hypothenus
        ;Draw
        LineXY(x1,y1,x2,Y2,#White)
        Circle(x1,y1,5,#Red)
        Circle(x2,y2,5,#Red)
        ;Draw target
        If Distance>=OldPathDistance And Distance<PathDistance ; If you are one this segment
          SegmentDistance=Distance-OldPathDistance
          Target\x=x1+(SegmentDistance/hypothenus*(x2-x1))
          Target\y=y1+(SegmentDistance/hypothenus*(y2-y1))
          Circle(Target\x,Target\y,5,#Green)
        EndIf 
        
        
      EndIf 
      
      
  Next 
  
  StopDrawing()
  
  
  
  FlipBuffers()
  ClearScreen(RGB(128, 128, 128))
  ExamineKeyboard()
  
Until KeyboardPushed(#PB_Key_Escape)

Re: Math en s'amusant

Publié : ven. 12/août/2022 22:38
par PAPIPP
Bonjour à tous

Voici un code qui détermine PI avec autant de digits que l’on désir.
Ce code, d’une utilité assez restreinte, est plutôt vu d’un point de vue amusant, c’ est une copie en purebasic du célèbre site rosetta code task :

https://rosettacode.org/wiki/Category:Programming_Tasks

Code : Tout sélectionner

#SCALE = 10000
#ARRINT=  2000
 
Procedure Pi(Digits)
  Protected First=#True, Text$
  Protected Carry, i, j, sum
  Dim Arr(Digits)
  For i=0 To Digits
    Arr(i)=#ARRINT
  Next
  i=Digits
  While i>0
    sum=0
    j=i
    While j>0
      sum*j+#SCALE*arr(j)
      Arr(j)=sum%(j*2-1)
      sum/(j*2-1)
      j-1
    Wend
    Text$ = RSet(Str(Carry+sum/#SCALE),4,"0")
    If First
      Text$ = ReplaceString(Text$,"3","3.")
      First = #False
    EndIf
    Print(Text$)
    Carry=sum%#SCALE
    i-14
  Wend
EndProcedure
nbdigits=24*1024*2
; nbdigits=24*1024*10
; nbdigits=24*1024*1024
If OpenConsole()
  PrintN(" pi avec = "+Str(nbdigits)+"  digits")
  PrintN(" ")
  SetConsoleCtrlHandler_(?Ctrl,#True) 
;   Pi(24*1024*1024)
  Pi(nbdigits)
  
EndIf
Input()
PrintN(#CRLF$+"Ctrl-C was pressed")

End

Ctrl:
Input()
PrintN(#CRLF$+"Ctrl-C was pressed")
End
A+

Re: Math en s'amusant

Publié : mar. 16/août/2022 9:52
par Ollivier
Ah... Pi !

Cet algo mérite peut-être un rappel de son auteur initial, qui ne s'est "pas foulé", en 1989, me semble-t-il.

C'était quelquechose comme << Bon euh moi je fais dans l'informatique... Pi, je le connais à l'infini, comme 1/3 = 0.333333... etc... jusqu'à l'infini, ben Pi = 2,222222... etc... jusqu'à l'infini en base e. Et convertir un nombre de la base e à la base 10, c'est, comme qui dirait, on ne peut plus simple, de surcroît, en informatique : c'est fait pour ! >>

Re: Math en s'amusant

Publié : mar. 13/sept./2022 13:35
par Ollivier
J'ai enfin retrouvé ce que je cherchais : l'algorithme "compte-goutte" de Stanley Rabinovitz.
Erratum dans le message précédent : pi n'est pas 2.22222... en base e. pi est 2.22222... dans une base variable (en l'occurrence 1/3; 2/5; 3/7; 4/9; 5;11; etc...

Re: Math en s'amusant

Publié : mar. 13/sept./2022 15:39
par Micoute
moi pour calculer PI, je dis la phrase suivante :

"Que j'aime à faire connaître ce nombre utile aux sages, immortel Archimède, artiste, ingénieur qui de ton jugement peut priser la valeur, pour moi il eut de pareils avantages."

il suffit de compter le nombre de lettres dans chaque mot.

Re: Math en s'amusant

Publié : sam. 04/mai/2024 16:45
par brossden
Deux petits problèmes pour le plaisir :

Le premier:

J'ai trois fois l'âge qui tu avais quand j'avais ton âge, quand tu auras mon âge nous auront ensemble 72 ans quels âges avons-nous ?

Le second :

Deux copains qui ne se sont pas vu depuis longtemps se rencontre dans un bar.
Au bout de quelques échanges concernant leur récent passé respectif l'un des deux lui dit :
J'ai trois enfants et la somme de leurs âges est égal au numéro de la maison d'en face.
Le second regarde ce numéro et lui dit que ce n'est pas suffisant pour trouver.
Le premier lui dit alors le produit de leurs âges est égal à 36.
Ce n'est toujours pas suffisant lui répond le second.
Bien alors sache que l'ainé mange de la soupe.
Ah OK, j'ai trouvé lui répond le second, et vous sauriez-vous me donner leurs âges respectifs en respectant toutes les données du problème ?

Et puis tien un troisième plus difficile:

Un homme récemment élu président de la république cherche à nommer son premier ministre.
Le problème c'est qu'il hésite entre trois personnes qui lui paraissent convenir pour ce poste.

Alors il leur dit :
Je vais vous mettre à la queue leu leu face à un mur.
Je dispose de 5 chapeaux 3 noirs et deux blancs la face inférieure des trois chapeaux est rouge.
Pendant que vous aurez les yeux bandés je déposerai à chacun un de ces 5 chapeaux et vous ne pourrez pas voir les deux restants.
Une fois les yeux débandés celui qui me donnera la bonne couleur de son chapeau sera nommé à ce poste sachant que si vous vous retournez vous serez disqualifié.

En résumé le premier personnage ne voir que le mur devant lui, le second voit celui qui est devant lui et le dernier voit les deux personnes devant lui.

L'enjeu étant de conséquent personne ne répond au hasard mais au bout d'un bon moment, le premier qui ne voit que le mur affirme qu'il a un chapeau noir! Pourquoi a-t' il raison ?

Re: Math en s'amusant

Publié : mer. 21/mai/2025 22:00
par SPH
brossden a écrit : sam. 04/mai/2024 16:45 Deux petits problèmes pour le plaisir :

Le premier:

J'ai trois fois l'âge qui tu avais quand j'avais ton âge, quand tu auras mon âge nous auront ensemble 72 ans quels âges avons-nous ?
J'ai trois fois l'âge qui tu avais quand j'avais ton âge
x=3*y
quand tu auras mon âge nous auront ensemble 72 ans
x+y=72

3*y+y=72
4*y=72
y=72/4
y=18

x=72-18
x=54

L'un a 18 ans et l'autre a 54 ans (j'espère ne pas m'être gourré)

Re: Math en s'amusant

Publié : dim. 25/mai/2025 19:12
par Demivec
J'ai trois fois l'âge qui tu avais quand j'avais ton âge, quand tu auras mon âge nous auront ensemble 72 ans quels âges avons-nous ?
(Moi) m
(Vous) v

Aujourd'hui, m = 3v

Quand v' = m; m' = m + (m - v)):
72 années = m' + v' = m + (m - v) + m = 3m - v = 3(3v) - v = 9v - v = 8v
v = 9

Aujourd'hui : v = 9 Ans; m = 27 Ans


@Correction

Re: Math en s'amusant

Publié : dim. 25/mai/2025 19:40
par SPH
Je n'ai plus l'habitude des devinettes mathématiques.
Cette phrase "J'ai trois fois l'âge qui tu avais quand j'avais ton âge" est difficilement compréhensible (pour moi).

J'aurais essayé :wink:

Re: Math en s'amusant

Publié : lun. 26/mai/2025 14:43
par case
J'ai trois fois l'âge qui tu avais quand j'avais ton âge, quand tu auras mon âge nous auront ensemble 72 ans quels âges avons-nous ?
impossible a résoudre en tout cas avec des entiers, j'ai pas tenté avec des float

la véritable énigme est probablement

J'ai trois fois l'âge qui tu avais quand j'avais ton âge, quand tu auras mon âge nous auront ensemble xx ans quels âges avons-nous ?

je vais prendre l'exemple de 27 ANS .

j'ai 27 ans, tu as donc 18 ans car quand j'avais 18 ans tu avais 9 ans ce qui fait bien mon age actuel si on multiplie par 3 (3*9=27)
tu aura mon age dans 9 ans. (18+9)=27 et moi j'aurais alors 36 ans(27+9) on aura alors 63 ans a tout les deux quand tu aura mon age.

maintenant 30 ans.
j'ai 30 ans, tu as donc 20 ans car quand j'avais 20 ans tu avais 10 ans ce qui fait bien mon age actuel si on multiplie par 3 (3*10=30)
tu aura mon age dans 10 ans. (20+10)=30 et moi j'aurais alors 40 ans(30+10) on aura alors 70 ans a tout les deux quand tu aura mon age.

enfin 33 ans
j'ai 33 ans, tu as donc 22 ans car quand j'avais 22 ans tu avais 11 ans ce qui fait bien mon age actuel si on multiplie par 3 (3*11=33)
tu aura mon age dans 11 ans. (22+11)=33 et moi j'aurais alors 44 ans(33+11) on aura alors 77 ans a tout les deux quand tu aura mon age.

pour que l'énoncé soit juste cela ne fonctionne pas avec 72 . ou alors j'ai mal compris.

:D :D :D