PureBasic

Forums PureBasic
Nous sommes le Mar 12/Nov/2019 15:09

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 47 messages ]  Aller à la page Précédente  1, 2, 3, 4  Suivante
Auteur Message
 Sujet du message: Re: Math en s'amusant
MessagePosté: Lun 05/Mar/2018 19:22 
Hors ligne
Avatar de l’utilisateur

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


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

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2801
Localisation: Klyntar
Sympa ces petits codes. Merci a tous du partage. :wink:






@++

_________________
Windows 10 x64, PureBasic 5.71 Beta 1 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz


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

Inscription: Dim 09/Oct/2005 16:51
Messages: 8779
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 :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


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

Inscription: Dim 02/Oct/2011 16:17
Messages: 2202
Localisation: 50200 Coutances
Bonjour à tous,
comme il ne faut qu'une seule fonctionnalité à mettre en évidence, voici mon code.
Code:
#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 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é: Mar 06/Mar/2018 11:00 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1528
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:
;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


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

Inscription: Mar 31/Mai/2016 9:06
Messages: 2103
Micoute a écrit:
Bonjour à tous,
comme il ne faut qu'une seule fonctionnalité à mettre en évidence, voici mon code.
Code:
#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:

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"


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

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

_________________

➽ 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é: Mar 06/Mar/2018 11:34 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1528
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:
;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 édition par Patrick88 le Mar 06/Mar/2018 12:44, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Mar 06/Mar/2018 12:20 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1528
déplace un point C perpendiculairement à un segment [A B]

Pat

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


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

Inscription: Mar 31/Mai/2016 9:06
Messages: 2103
Calcul du point d'arrivé en fonction de la distance et de l'angle

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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Mar 06/Mar/2018 19:19 
Hors ligne

Inscription: Mer 21/Jan/2004 18:24
Messages: 1528
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:
;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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Mer 07/Mar/2018 10:22 
Hors ligne
Avatar de l’utilisateur

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

_________________

➽ 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é: Mer 07/Mar/2018 18:42 
Hors ligne
Avatar de l’utilisateur

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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Mer 07/Mar/2018 21:46 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1634
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:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0), Raspberry Pi


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Math en s'amusant
MessagePosté: Mer 07/Mar/2018 22:09 
Hors ligne
Avatar de l’utilisateur

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


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 Précédente  1, 2, 3, 4  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 8 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