Math en s'amusant

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Math en s'amusant

Message par Zorro »

disons, que ça fait une belle paire de fesses , vu du dessus !!
si t'as pas vu ça, alors effectivement, t'es un vicelard !! :lol:
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
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Math en s'amusant

Message par venom »

Sympa ces petits codes. Merci a tous du partage. :wink:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Math en s'amusant

Message par Ar-S »

Merci Falsam pour ces petits codes. Moi qui suis un gros busard en math, j'apprécie ces petits codes et ne suis surement pas le seul.
~~~~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 »

Bonjour à tous,
comme il ne faut qu'une seule fonctionnalité à mettre en évidence, voici mon code.

Code : Tout sélectionner

#Jours_par_Semaine   = 7
#Heures_par_Jour     = 24
#Mn_par_Heure        = 60
#Sec_par_Heure       = 3600
#Sec_par_Mn          = 60

Procedure Jour_en_Secondes(Jours.i)
  secondes = Jours * #Heures_par_Jour * #Mn_par_Heure * #Sec_par_Mn
  ProcedureReturn secondes
EndProcedure

Debug Jour_en_Secondes(1)
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 !
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Math en s'amusant

Message par Patrick88 »

bon, j'en ai un peu bavé avec les pointeurs *vector, difficile (pour moi) à voir le contenu dans le deboggueur, je suis passé par tout un tas de variables intermédiaires...

il n'y a pas de teste pour savoir si l'intersection est possible
- cas des segments se chevauchant ou alignés -> coef. directeur identique
- cas ou les segments ne se croisent pas. -> segment parallèle
- cas ou les segment se croisent mais ou le point d'intersection se trouvent au delà de la limite de la longueur des segments -> intersection projetée
(bon c'est vrai que sans dessin c'est difficile à ce le représenter)

voilou ma petite contrib. petit code depuis bien bien longtemps.

Pat

Code : Tout sélectionner

;Patrick88 - 06/03/2018 - Recherche de du point d'intersection de 2 segments d'après
; http://www.purebasic.fr/french/viewtopic.php?f=1&t=17175

;Niveau de difficulté : *

;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 ; pt = pt d'intersection

;Afficher un texte
Global SpriteText, Buffer.s = "Intersection de 2 segments [A B] et [C D]", TextWidth, TextHeight

;Marge affichage texte
Global Margin = 6

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

;Math
Declare.i inter2DPoint(*P1.Vector, *P2.Vector ,*P3.Vector, *P4.Vector)
GameStart()

Procedure GameStart()
  If InitSprite()
    InitKeyboard()
    InitMouse()
   
    ;Définition du point A
    A\x = 100
    A\y = 150
   
    ;Définition du point B
    B\x = 575
    B\y = 525   
   
    ;Définition du point A
    C\x = 150
    C\y = 573
   
    ;Définition du point B
    D\x = 585
    D\y = 50
   
    *pt = Inter2DPoint(A, B, C, D)
   
    OpenWindow(0, 0, 0, 800, 600, "Jeu de Math : Intersection de 2 segments [A B] et [C D]", #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(255,255,255))
   
    ;Affichage des point A B C D
    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))
   
    ;Affichage point C
    Circle(C\x, C\y, 2, RGB(255, 0, 0))
    DrawText(C\x + Margin, C\y - Margin*2, "C", RGB(0, 0, 0))
   
    ;Affichage point D
    Circle(D\x, D\y, 2, RGB(255, 0, 0))
    DrawText(D\x + Margin, D\y - Margin*2, "D", RGB(0, 0, 0))
   
    ;Ligne entre A et B
    LineXY(A\x, A\y, B\x, B\y, RGB(0, 0, 0))
   
    ;Ligne entre C et D
    LineXY(C\x, C\y, D\x, D\y, RGB(0, 0, 0))
   
    ;Affichage point D'intersection
    Circle(*pt\x, *pt\y, 2, RGB(255, 0, 0))
    DrawText(*pt\x + Margin, *pt\y - Margin*2, "Intersection", RGB(0, 0, 0))
   
    StopDrawing()
      
    ExamineKeyboard()
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

Procedure GameEnd()
  End
EndProcedure

;Retourne l'intersection de deux vecteurs (Points 2D)
Procedure.i inter2DPoint(*P1.Vector, *P2.Vector ,*P3.Vector, *P4.Vector)
  Protected *Result.Vector = AllocateMemory(SizeOf(Point))
  Protected coef_S1.f, coef_S2.f ; coef directeur ou tangente alpha en radian
  Protected ord_S1.f, ord_S2.f ; point sur l'ordonné

  coef_S1 = (*P2\y - *P1\y) / (*P2\x - *P1\x)
  coef_S2 = (*P4\y - *P3\y) / (*P4\x - *P3\x)
  ord_S1 = *P1\y - coef_S1 * *P1\x
  ord_S2 = *P3\y - coef_S2 * *P3\x

  *Result\x = (ord_S2 - ord_S1) / (coef_S1 - coef_S2)
  *Result\y = coef_S1 * *Result\x + ord_S1

  ProcedureReturn *Result
EndProcedure
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Math en s'amusant

Message par Zorro »

Micoute a écrit :Bonjour à tous,
comme il ne faut qu'une seule fonctionnalité à mettre en évidence, voici mon code.

Code : Tout sélectionner

#Jours_par_Semaine   = 7
#Heures_par_Jour     = 24
#Mn_par_Heure        = 60
#Sec_par_Heure       = 3600
#Sec_par_Mn          = 60

Procedure Jour_en_Secondes(Jours.i)
  secondes = Jours * #Heures_par_Jour * #Mn_par_Heure * #Sec_par_Mn
  ProcedureReturn secondes
EndProcedure

Debug Jour_en_Secondes(1)


heu ... pourquoi ne pas faire directement ceci ??

Code : Tout sélectionner


Procedure Jour_en_Secondes(Jours.i)
  secondes = 86400*Jours.i
  ProcedureReturn secondes
EndProcedure

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

Re: Math en s'amusant

Message par falsam »

@Patrick88 : Très bien ce code pour un tower défense 2D par exemple. Code ajouté dans le premier message.

Pensez au titre d'accroche quand vous proposez un code. :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Math en s'amusant

Message par Patrick88 »

De quel coté d'un segment [A B] se trouve un point C

un segment [A B] et un point C quelque part sur l'écran.
Indique de quel coté du segment se trouve le point, à droite ou à gauche du segment.

[Up] code nettoyé comme précédement, affichage du coté du point dans la petite bubulle :mrgreen: -> Procedure.l CreeSpritetexte(texte.s) + les 2 variables SpriteGauche,SpriteDroit

Pat

Code : Tout sélectionner

;Patrick88 - 06/03/2018 - Indique de quel coté du segment [A B] se trouve le point C, à droite ou à gauche du segment d'après
; http://www.purebasic.fr/french/viewtopic.php?f=1&t=17175

;Niveau de difficulté : *

;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

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

;Marge affichage texte
Global Margin = 6

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

;Math
Declare.i coTd1Segment2d(*P1.Vector, *P2.Vector ,*P3.Vector)
GameStart()

Procedure.l CreeSpritetexte(texte.s)
  Protected SpriteText.l
  
  ;Creation du sprite text à afficher
  SpriteText = CreateSprite(#PB_Any, 200, 24, #PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(SpriteText))
  TextWidth  = TextWidth(texte)
  textHeight = TextHeight(texte)
  
  ;Fond
  DrawingMode(#PB_2DDrawing_AllChannels)
  Box(0, 0, SpriteWidth(SpriteText), 24, RGBA(0, 0, 0, 0))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  RoundBox(0, 0, SpriteWidth(SpriteText), 24, 6, 6, RGBA(218, 165, 32, 255))
  
  ;Text
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText((SpriteWidth(SpriteText) - TextWidth)/2, (24 - TextHeight)/2, texte, RGBA(0, 0, 0, 255))
  
  ;Contour
  DrawingMode(#PB_2DDrawing_Outlined)
  RoundBox(0, 0, SpriteWidth(SpriteText), 24, 6, 6, RGBA(0, 0, 0, 255))
  StopDrawing()  
  ProcedureReturn SpriteText
EndProcedure
    
Procedure GameStart()
  If InitSprite()
    InitKeyboard()
    InitMouse()
   
    ;Définition du point A
    A\x = 100
    A\y = 150
   
    ;Définition du point B
    B\x = 575
    B\y = 525   
   
    ;Définition du point C
    C\x = 150
    C\y = 150;573
      
    *pt = coTd1Segment2d(A, B, C)
   
    OpenWindow(0, 0, 0, 800, 600, "Jeu de Math : Indique de quel coté du segment [A B] se trouve le point C, à droite ou à gauche du segment. ",  #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    BindEvent(#PB_Event_CloseWindow, @GameEnd())
   
    OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
    
    SpriteGauche = CreeSpritetexte("et à gauche du segment [A B]")
    SpriteDroit = CreeSpritetexte("et à droite du segment [A B]")
    
    GameUpdate()
  Else
    GameEnd()
  EndIf
EndProcedure

Procedure GameUpdate()
  Repeat : Repeat : Until WindowEvent() = 0
    ClearScreen(RGB(255,255,255))
   
    ;Affichage des point A B C D
    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))
   
    ;Affichage point C
    Circle(C\x, C\y, 2, RGB(255, 0, 0))
    DrawText(C\x + Margin, C\y - Margin*2, "C", RGB(0, 0, 0))
     
    ;Ligne entre A et B
    LineXY(A\x, A\y, B\x, B\y, RGB(0, 0, 0))
   
    StopDrawing()
    
    If C\y > *pt\y
      DisplayTransparentSprite(SpriteGauche, C\x+20, C\y - SpriteHeight(SpriteGauche)/2)
      ElseIf C\y < *pt\y
        DisplayTransparentSprite(SpriteDroit, C\x+20 , C\y - SpriteHeight(SpriteDroit)/2) 
        ElseIf C\y = *pt\y
          DisplayTransparentSprite(SpriteDroit, C\x+20 , C\y - SpriteHeight(SpriteDroit)/2) 
    EndIf
     
    ;RotateSprite(SpriteText, Angle2DPoint(B, A), #PB_Absolute)
     
    ExamineKeyboard()
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

Procedure GameEnd()
  End
EndProcedure

; recherche de quel coté d'un segment se trouve le point
Procedure.i coTd1Segment2d(*P1.Vector, *P2.Vector ,*P3.Vector)
  Protected *Result.Vector = AllocateMemory(SizeOf(Point))
  Protected coef_S1.f, coef_S2.f ; coef directeur ou tangente alpha en radian
  Protected ord_S1.f, ord_S2.f   ; point sur l'ordonné
  
  coef_S1 = (*P2\y - *P1\y) / (*P2\x - *P1\x)
  ord_S1 = *P1\y - coef_S1 * *P1\x
  
  *Result\x = *P3\x
  *Result\y = coef_S1 * *Result\x + ord_S1
  
  ProcedureReturn *Result
EndProcedure  
Dernière modification par Patrick88 le mar. 06/mars/2018 12:44, modifié 2 fois.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Math en s'amusant

Message par Patrick88 »

déplace un point C perpendiculairement à un segment [A B]

Pat

Code : Tout sélectionner

;Patrick88 - 06/03/2018 - deplace un point C perpendiculairement à un segment [A B] d'après
; http://www.purebasic.fr/french/viewtopic.php?f=1&t=17175

;Niveau de difficulté : *

;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

;Afficher un texte
Global SpriteText, Buffer.s = "...", TextWidth, TextHeight

;Marge affichage texte
Global Margin = 6

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

;Math
Declare.i DeplacePoint2dSur1Segment2d(*P1.Vector, *P2.Vector ,*P3.Vector)
GameStart()

Procedure GameStart()
  If InitSprite()
    InitKeyboard()
    InitMouse()
   
    ;Définition du point A
    A\x = 100
    A\y = 150
   
    ;Définition du point B
    B\x = 575
    B\y = 525   
   
    ;Définition du point C
    C\x = 550
    C\y = 50; 573
      
    *pt = DeplacePoint2dSur1Segment2d(A, B, C)
   
    OpenWindow(0, 0, 0, 800, 600, "Jeu de Math : deplace un point C perpendiculairement à 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(255,255,255))
   
    ;Affichage des point A B C D
    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))
   
    ;Affichage point C
    Circle(C\x, C\y, 2, RGB(255, 0, 0))
    DrawText(C\x + Margin, C\y - Margin*2, "C", RGB(0, 0, 0))
     
    ;Ligne entre A et B
    LineXY(A\x, A\y, B\x, B\y, RGB(0, 0, 0))
   
    ;Affichage point projeté *px
    Circle(*pt\x, *pt\y, 2, RGB(255, 0, 0))
    DrawText(*pt\x + Margin, *pt\y - Margin*2, "Point sur le segment [A B]", RGB(0, 0, 0))
    
    ;Ligne entre C et *pt
    LineXY(C\x, C\y, *pt\x, *pt\y, RGB(255, 0, 0))
   
    StopDrawing()
     
    ExamineKeyboard()
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

Procedure GameEnd()
  End
EndProcedure

; deplace un point C perpendiculairement à un segment [A B]
Procedure.i DeplacePoint2dSur1Segment2d(*P1.Vector, *P2.Vector ,*P3.Vector)
  Protected *Result.Vector = AllocateMemory(SizeOf(Point))
  Protected coef1.f ; coef directeur ou tangente alpha en radian
  Protected ord1.f ; point sur l'ordonné

  ; on deplace le point P3 sur le segment [A B]
  coef1 = (*P2\y - *P1\y) / (*P2\x - *P1\x)
  ord1 = *P1\y - coef1 * *P1\x
  
  ; on recalcul le point
  *Result\x = (coef1 * (*p3\y - ord1) + *p3\x) / ( 1 + Pow(coef1,2))
  *Result\y = (-1/coef1) * *Result\x + *p3\y + (*p3\x / coef1)
  
  ProcedureReturn *Result
EndProcedure  
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Math en s'amusant

Message par Zorro »

Calcul du point d'arrivé en fonction de la distance et de l'angle

Code : Tout sélectionner

x_arrive=X_depart.f+Cos(Angle*#PI/180)* Distance_a_parcourir.f
y_arrive=Y_depart.f+Sin(Angle*#PI/180)* Distance_a_parcourir.f
qui va calculer le point d'arrivé , en prenant le point de depart, la distance, et l'angle en compte !!
autrement dit , s'il n'y a qu'une seule fonction a connaitre, c'est celle là , car elle permet
l'utilisation de deplacement, collisions, en jeux video 2D et 3D ....

ou de connaitre le point d'arrivé d'un jet de pierre par exemple en connaissant le point de depart et l'angle :)

le point de depart peut concerner un personnage , un endroit de l'ecran , ou de l'univers 2D ....
la fonction va calculer le point d'arrivé en fonction de la distance ... :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Math en s'amusant

Message par Patrick88 »

petite coquille (pas vraiment une)(dépend de quel coté on se place)
dans l'exemple Angle d'un segment de droite [A B]
si on est humain, c'est bon la fonction renvoi des degrés.
du coté de l'ordi, il ne comprends que les radians... faudrait rajouter un flag..

tant que tu y es, tu peux ajouter une fonction

Code : Tout sélectionner

;Retourne l'angle entre deux vecteurs 2D
Procedure.f Angle2Segment2D(*P1.Vector, *P2.Vector ,*P3.Vector, *P4.Vector)
 Protected angle1.f, angle2.f
  
 angle1 = Angle2DPoint(*P1.Vector, *P2.Vector)
 angle2 = Angle2DPoint(*P3.Vector, *P4.Vector)
 
 ProcedureReturn angle1 - angle2
EndProcedure
pat
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 »

@Zorro : Calculer un point de chute uniquement en fonction d'un angle et d'une distance que je suppose linéaire et oblique me semble simpliste. Ca reviendrait à dire que la chute est verticale quand la distance est atteinte. Si ta distance est horizontale alors ta formule est dans ce cas bien compliquée :wink:

@Patrick88 : Tu abuses un peu avec ta procédure qui fait appel à une procédure inexistante. On est ici pour s'amuser. On veut un peu de code boudiou :mrgreen:
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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Math en s'amusant

Message par Zorro »

falsam a écrit :@Zorro : Calculer un point de chute uniquement en fonction d'un angle et d'une distance que je suppose linéaire et oblique me semble simpliste. Ca reviendrait à dire que la chute est verticale quand la distance est atteinte. Si ta distance est horizontale alors ta formule est dans ce cas bien compliquée :wink:
non ce n'est pas mon propos

ma fonction te donne a partir d'un point X,Y et d'un angle , et d'une distance , un point d'arrivé !
mon analogie a la pierre lancé considere effectivement que tu te situe sur un point de depart

que tu lances la pierre (ou plutot le galet qui glisse sur une patinoire) avec un angle de jet , et que tu veuilles que ce galet parcours une certaine distance
cela te renvois alors le point d'arrivée exact ! AVANT meme le lancé :)


c'est super utile par exemple pour un vaisseau spacial sur l'ecran 2d

il represente la position de depart , il se dirige dans un certain angle , avec un Pas de deplacement (qui represente ici la distance a parcourir a chaque boucle)
comme la fonction renvoie la coordonée d'arrivée, on peut lire la couleur a l'ecran de cette coordonée d'arrivée future de notre vaiseau , et ainsi savoir si un obstacle est present .. bref un test de collision


sinon on peut se servir de cette fonction comme je le fait avec le code de MiniPureGolo que j'ai posté recemment
pour deplacer une tortue qui laisse un trait derriere elle

on lui donne la coordonée de depart (la tortue) , le Pas de deplacement, et l'angle , on sait donc exactement sur quel pixel la tortue va atterrir
plus qu'a tracer un trait du point de depart, au point d'arrivée maintenant connu :)

cette fonction permet donc soit de savoir la couleur d'un pixel AVANT le deplacement d'un sprite (our un test de collision par exemple)
soit de connaitre le pixel d'arrivée AVANT le deplacement d'un sprite

et cette derniere information permet de dessiner, ou de changer la couleur du pixel d'arrivé
une espece de "Super LINE(x,y) " puis qu'on peut dessiner une ligne, sans se soucier de l'arrivée
juste en lui fournissant le point de depart, et l'angle du dessin ... et une longueur
le point d'arrivé c'est la fonction qui le renvoie .... :)

Mon PureGolo (interpreteur Logo maison ) est basé la dessus par exemple
ça ouvre la possibilité de dessiner comme on le ferai faire a un petit robot en lui donnant des ordres
"tourne a droite de 30 degres , avance de 10 pas , tourne a gauche de 50 degres , recule de 100 pas " etc...
donc ça peut aussi servir a diriger des Ennemis dans un Jeux de tir , ou de Tanks par exemple :)

pour chacun d'entre eux , on aura la position d'arrivé juste en donnant leur position , leur angle, et la distance qu'ils doivent parcourrir
ça renverra la coordonée d'arrivée ... :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Math en s'amusant

Message par Marc56 »

S'appelle tout simplement les coordonnées polaires par rapport aux coordonnées rectangulaires.
La base de tout système de dessin et du travail des géomètres.
Sinus côté opposé angle
Cosinus côté adjacent angle
Etc.

:wink:
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Math en s'amusant

Message par Zorro »

Je ne suis pas matheu, donc merci pour l'explication :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre