Math en s'amusant

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Math en s'amusant

Message 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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Math en s'amusant

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Math en s'amusant

Message 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

Avatar de l’utilisateur
Ar-S
Messages : 9475
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Math en s'amusant

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
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 »

c'est mieux avec:

Code : Tout sélectionner

For Angle = - 90 To maxangle - 90 Step 10
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
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message 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)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Math en s'amusant

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Math en s'amusant

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

Re: Math en s'amusant

Message 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...
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 »

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.
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