Dessiner un engrenage

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Dessiner un engrenage

Message par Flype »

Comment vous feriez pour dessiner un engrenage :?:
moi et les math...
Image
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

facile, il suffit de faire une répétition angulaire d'une forme.

aller, je me lance, la réponse après la pub :mrgreen:
Dernière modification par Le Soldat Inconnu le sam. 08/mai/2004 19:22, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le lun. 10/oct./2005 9:09, modifié 2 fois.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

j'ai fait ça en vitesse, bon c'est des dent un peut pointu mais bon... je te laisse l'ammener chez le dentiste :)

Code : Tout sélectionner

#PI = 3.14159265

InitSprite()
InitKeyboard()

OpenScreen(800, 600, 32, "")

Procedure Engrenage(x.l, y.l, r1.f, r2.f, p.f)
  a.f
  a2.f
 
  StartDrawing(ScreenOutput())
    Repeat
      a = a2
      a2 + p
      
      b + 1
      If b > 1 : b = 0 : EndIf
      
      If b
        xp1 = r1 * Cos(a) + x
        yp1 = r1 * Sin(a) + y
        
        xp2 = r2 * Cos(a2) + x
        yp2 = r2 * Sin(a2) + y
      Else
        xp1 = r1 * Cos(a2) + x
        yp1 = r1 * Sin(a2) + y
        
        xp2 = r2 * Cos(a) + x
        yp2 = r2 * Sin(a) + y
      EndIf
      
      LineXY(xp1, yp1, xp2, yp2, RGB(180, 150, 250))
      Plot(xp, yp, RGB(200, 200, 200))
  
    Until a >= 2 * #PI
  StopDrawing()

EndProcedure

div = 8

Repeat

  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Up)   : div + 1 : EndIf
  If KeyboardPushed(#PB_Key_Down) : div - 1 : EndIf
  
  ClearScreen(0, 0, 0)
  
  Engrenage(400, 300, 100, 200, #pi / div)
  
  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ma solution :

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.81
; 
; Explication du programme :
; Dessiner un engrenage

Procedure Engrenage(x.l, y.l, Rayon.l, RayonAlesage.l, NbDents.l, HauteurDent.l, Couleur.l)
  StartDrawing(ImageOutput())
  
    DrawingMode(4)
    Circle(x, y, Rayon - HauteurDent, Couleur) ; on dessine l'engrenage
    Circle(x, y, RayonAlesage, Couleur) ; on dessine le trou de l'engrenage
    DrawingMode(0)
    FillArea(x, y + RayonAlesage + 2, Couleur, Couleur) ; on rempli l'engrenage
     
    LargeurDent = Int(Rayon * 3 / 5 * Sin(#PI / NbDents) + 0.5) ; on détermine la largeur d'une dents
    
    For n = 1 To NbDents ; on passe en revue toutes les dents
      
      Cos.f = Cos(n * 2 * #PI / NbDents) ; Calcul du cos de l'angle
      Sin.f = Sin(n * 2 * #PI / NbDents) ; Calcul du sin de l'angle
      
      ; Point haut gauche de la dent
      PosX1 = Int(x + Rayon * Cos + LargeurDent / 2 * Sin + 0.5)
      PosY1 = Int(y + Rayon * Sin - LargeurDent / 2 * Cos + 0.5)
      ; Point haut droit de la dent
      PosX2 = Int(x + Rayon * Cos - LargeurDent / 2 * Sin + 0.5)
      PosY2 = Int(y + Rayon * Sin + LargeurDent / 2 * Cos + 0.5)
      ; Point bas gauche de la dent
      PosX3 = Int(x + (Rayon - HauteurDent - 2) * Cos + LargeurDent * Sin + 0.5)
      PosY3 = Int(y + (Rayon - HauteurDent - 2) * Sin - LargeurDent * Cos + 0.5)
      ; Point bas droit de la dent
      PosX4 = Int(x + (Rayon - HauteurDent - 2) * Cos - LargeurDent * Sin + 0.5)
      PosY4 = Int(y + (Rayon - HauteurDent - 2) * Sin + LargeurDent * Cos + 0.5)
      
      ; Dessin du contour de la dent
      LineXY(PosX1, PosY1, PosX2, PosY2, Couleur)
      LineXY(PosX1, PosY1, PosX3, PosY3, Couleur)
      LineXY(PosX4, PosY4, PosX2, PosY2, Couleur)
      
      ; Remplissage de la dent
      FillArea(Int(x + (Rayon - HauteurDent / 2) * Cos + 0.5), Int(y + (Rayon - HauteurDent / 2) * Sin + 0.5), Couleur, Couleur)
      
    Next
  StopDrawing()
EndProcedure


;- Exemple

; Création de la fenêtre et dela GadgetList
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; Création de l'image
CreateImage(0, 300, 300)
StartDrawing(ImageOutput())
  Box(0, 0, 300, 300, RGB(255, 255, 255))
StopDrawing()

; On dessine l'engrenage
Engrenage(150, 150, 120, 40, 16, 30, 0)

; On affiche l'image
ImageGadget(0, 0, 0, 300, 300, UseImage(0))

Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_EventCloseWindow

End
un petit screen :
Image

Message édité : j'ai ajouté des commentaires et fait une procedure Engrenage(...)
Dernière modification par Le Soldat Inconnu le sam. 08/mai/2004 19:53, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le lun. 10/oct./2005 9:09, modifié 2 fois.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

va falloir lui raboter les cros à ton engrenage :mrgreen:

mais la méthode est pas bête du tout :D c'est bien trouvé
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est génial :P

merci les gars zetes trop fort !!!

l'engrenage de regis est superbe

je cherchais à faire un engrenage qui tourne fluidement pour faire une belle anim à publier pour ma future userlib GadAnim

merci en tout cas de votre reactivité 8)
Image
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le lun. 10/oct./2005 9:10, modifié 1 fois.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

@dr dri

n'empeche, c gentil

@comtois

il est pas mal non plus :wink:
Image
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

je suis a la ramasse avec mon engrenage a 2 balle lol :lol:
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

bon voila, ameliorer :) il a plus les dents pointu, ni plates mais arrondi :D
et en plus il tourne, pi on peut choisir la precision, les fleche up et down permet d'augmenter ou diminuer le nombre de dent (a 3 ça rend bien je trouve :) )
je pense qu'avec ces 3 version (regis et dri) tu a de quoi faire :)

Code : Tout sélectionner

#PI = 3.14159265

InitSprite()
InitKeyboard()

OpenScreen(800, 600, 32, "")

Procedure Engrenage(x.l, y.l, r1.f, r2.f, p.f, an.f, pr.f)
  a.f
  a2.f
 
  StartDrawing(ScreenOutput())
    Repeat
      
      Repeat
        
        a + pr
    
        If b
          xp1 = r1 * Cos(a + an) + x
          yp1 = r1 * Sin(a + an) + y
        Else
          xp1 = r2 * Cos(a + an) + x
          yp1 = r2 * Sin(a + an) + y
        EndIf

      
        Plot(xp1, yp1, RGB(200, 180, 255))
      Until a > a2 + p
      If b
        xp2 = r2 * Cos(a + an) + x
        yp2 = r2 * Sin(a + an) + y
      Else
        xp2 = r1 * Cos(a + an) + x
        yp2 = r1 * Sin(a + an) + y
      EndIf
      LineXY(xp1, yp1, xp2, yp2, RGB(200, 180, 255))
      
      a2.f + p
      a.f = a2
      
      b + 1
      If b > 1 : b = 0 : EndIf
    Until a2 >= 2* #PI
    
  StopDrawing()

EndProcedure

div = 8

Repeat

  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Up)   : div + 1 : EndIf
  If KeyboardPushed(#PB_Key_Down) : div - 1 : EndIf
  
  ClearScreen(0, 0, 0)
  
  a.f + 0.01
  If a > 2 * #Pi : a = 0 : EndIf
  
  Engrenage(400, 300, 125, 200, #pi / div, a, 0.001)
  
  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)
le meme mais mieux, y en a 4 :)

Code : Tout sélectionner

#PI = 3.14159265

InitSprite()
InitKeyboard()

OpenScreen(800, 600, 32, "")

Procedure Engrenage(x.l, y.l, r1.f, r2.f, p.f, an.f, pr.f)
  a.f
  a2.f
 
  StartDrawing(ScreenOutput())
    Repeat
      
      Repeat
        
        a + pr
    
        If b
          xp1 = r1 * Cos(a + an) + x
          yp1 = r1 * Sin(a + an) + y
        Else
          xp1 = r2 * Cos(a + an) + x
          yp1 = r2 * Sin(a + an) + y
        EndIf

      
        Plot(xp1, yp1, RGB(200, 180, 255))
      Until a > a2 + p
      If b
        xp2 = r2 * Cos(a + an) + x
        yp2 = r2 * Sin(a + an) + y
      Else
        xp2 = r1 * Cos(a + an) + x
        yp2 = r1 * Sin(a + an) + y
      EndIf
      LineXY(xp1, yp1, xp2, yp2, RGB(200, 180, 255))
      
      a2.f + p
      a.f = a2
      
      b + 1
      If b > 1 : b = 0 : EndIf
    Until a2 >= 2* #PI
    
  StopDrawing()

EndProcedure

div = 8

Repeat

  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Up)   : div + 1 : EndIf
  If KeyboardReleased(#PB_Key_Down) : div - 1 : EndIf
  
  ClearScreen(0, 0, 0)
  
  a.f + 0.01
  If a > 2 * #Pi : a = 0 : EndIf
  
  Engrenage(330, 300, 50, 75, #pi / div, a, 0.001)
  Engrenage(470, 300, 50, 75, #pi / div, -a, 0.001)
  Engrenage(470, 440, 50, 75, #pi / div, a, 0.001)
  Engrenage(330, 160, 50, 75, #pi / div, -a, 0.001)
  
  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'ai pas testé, mais t'aurais pas un risque de division par 0, ici?

Code : Tout sélectionner

ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Up)   : div + 1 : EndIf 
  If KeyboardPushed(#PB_Key_Down) : div - 1 : EndIf <-- ici
  
  ClearScreen(0, 0, 0) 
  
  a.f + 0.01 
  If a > 2 * #Pi : a = 0 : EndIf 
  
  Engrenage(400, 300, 125, 200, #pi / div, a, 0.001)

par rapport à ici --------------------^

nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Attention, le code de Cedravic peut bloquer complètement le PC, reboot assurer!

Le problème survient lorqu'on réduit le nombre de dents 1 , dans ce cas il ne faut plus le réduire.

Sinon, une fois le bug corrigé, ça mérite sa place au code FR :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

bravo en tout cas ! ca a de la gu... :wink:

qu'esperer de mieux ? le lissage comme sait faire Regis ?
Image
Répondre