Page 1 sur 2

Rotation d'Ellipse & Pie Chart 3D Animés

Publié : ven. 10/oct./2014 9:54
par kernadec
bonjour
Voici un exemple de la fonction ellipse avec choix de l'angle de Rotation et qui doit être cross plateforme :D

Cordialement

[réédit] Ajout de la fonction round au calcul du tracé en rotation pour améliorer celui-ci
et aussi les paramètres début fin pour dessiner des arcs de cercle

Code : Tout sélectionner

Procedure Ellipse_rotation(Axex.l, Axey.l, Xrayon.l, Yrayon.l, Rot.d, Debut.l, Fin.l, Couleur.l) 
  
  Protected Angle.d, R.d, X.d, Y.d, Posx1.l, Posy1.l, Posx2.l, Posy2.l
  
  R = Radian(Rot)
  
  For o = Debut To fin 
    
    Angle = Radian(o)
    
    X =  Cos(Angle) * Xrayon                          
    Y = -Sin(Angle) * Yrayon
    
    Posx1 = Round(X * Cos(R) + Y * Sin(R), #PB_Round_Nearest) + Axex  ;round pour un meilleur tracé
    Posy1 = Round(X * Sin(R) - Y * Cos(R), #PB_Round_Nearest) + Axey
    
    If Posx2 = 0 And Posy2 = 0 : Posx2 = Posx1 : Posy2 = Posy1 : EndIf
    
    LineXY(Posx2, Posy2, Posx1, Posy1, Couleur)
    
    Posx2 = Posx1
    Posy2 = Posy1
    
  Next o  
  
EndProcedure


If OpenWindow(0, 0, 0, 500,500, "Ellipse en rotation ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 480, 480)
  
  StartDrawing(CanvasOutput(0))
  
  For i = 0 To 360 Step 15
    
    ;Ellipse_rotation(240,240,100,220, i, 0, 360, RGB(Random(255) ,Random(255), Random(255)))
    Ellipse_rotation(240, 240, 100, 220, i, 0, 360, RGB(0, 0, 0))
    
  Next i
  
  StopDrawing()
  
  Repeat
    
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Rotation d'Ellipse

Publié : ven. 10/oct./2014 17:58
par kernadec
Bonsoir
Modification du code précédent avec ajout des paramètres début et fin pour avoir des arcs de cercle
et dessiner des rosaces etc..
Exemples avec le code suivant

Cordialement

Code : Tout sélectionner

Procedure Ellipse_rotation(Axex.l, Axey.l, Xrayon.l, Yrayon.l, Rot.d, Debut.l, Fin.l, Couleur.l) 
  
  Protected angle.d, R.d, X.d, Y.d, Posx1.l, Posy1.l, Posx2.l, Posy2.l
  
  R = Radian(Rot)
  
  For o = Debut To fin 
    
    Angle = Radian(o)
    
    X =  Cos(Angle) * Xrayon                          
    Y = -Sin(Angle) * Yrayon
    
    Posx1 = Round(X * Cos(R) + Y * Sin(R), #PB_Round_Nearest) + Axex  ;round pour un meilleur tracé
    Posy1 = Round(X * Sin(R) - Y * Cos(R), #PB_Round_Nearest) + Axey
    
    If Posx2 = 0 And Posy2 = 0 : Posx2 = Posx1 : Posy2 = Posy1 : EndIf
    
    LineXY(Posx2, Posy2, Posx1, Posy1, Couleur)
    
    Posx2 = Posx1
    Posy2 = Posy1
    
  Next o  
  
EndProcedure


If OpenWindow(0, 0, 0, 1030,768, "Ellipse en rotation ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 1010, 728)
  
  StartDrawing(CanvasOutput(0))
  
  For i = 0 To 360 Step 15
    
    ;Ellipse_rotation(240,240,100,220, i,RGB(Random(255) ,Random(255), Random(255)))
    Ellipse_rotation(130, 130, 50, 120, i, 74, 184, RGB(0, 0, 0))
    Ellipse_rotation(380, 130, 55, 120, i, 120, 240, RGB(0, 0, 0))
  Next i
  For i = 0 To 360 Step 72
    
    Ellipse_rotation(630, 130, 20, 120, i, -2, 182, RGB(0, 0, 0))
    Ellipse_rotation(880, 130, 66, 120, i, 36, 202, RGB(0, 0, 0))
  Next i
  For i = 0 To 360 Step 30
    
    Ellipse_rotation(130, 380, 10, 120, i, 17, 163, RGB(0, 0, 0))
    Ellipse_rotation(380, 380, 40, 120, i, 52, 128, RGB(0, 0, 0))
  Next i
  For i = 0 To 360 Step 5
    
    Ellipse_rotation(630, 380, 20, 120, i, 75, 105, RGB(0, 0, 0))
    Ellipse_rotation(880, 380, 30, 120, i, 180, 270, RGB(0, 0, 0))
  Next i
  For i = 0 To 360 Step 30
    
    Ellipse_rotation(130, 610, 60, 90, i, 0, 270, RGB(0, 0, 0))
    Ellipse_rotation(380, 610, 60, 90, i, 50, 130, RGB(0, 0, 0))
  Next i
  For i = 1 To 360 Step 24
    
    Ellipse_rotation(630, 610, 90, 20, i, 26, 154, RGB(0, 0, 0))
    Ellipse_rotation(880, 610, 10, 100, i, 175, 280, RGB(0, 0, 0))
  Next i
  StopDrawing()
  
  Repeat
    
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Rotation d'Ellipse

Publié : lun. 13/oct./2014 18:24
par kernadec
bonsoir
Petit essai de Chart Graph avec le procédure ellipse

Cordialement

Code : Tout sélectionner

Procedure Ellipse_rotation(Axex.l, Axey.l, Xrayon.l, Yrayon.l, Rot.d, Debut.l, Fin.l, Couleur.l) 
  
  Protected angle.d, R.d, X.d, Y.d, Posx1.l, Posy1.l, Posx2.l, Posy2.l
  
  R = Radian(Rot)
  
  For o = Debut To fin 
    
    Angle = Radian(o)
    
    x =  Cos(Angle) * Xrayon                          
    y = -Sin(Angle) * Yrayon
    
    Posx1 = Round(X * Cos(R) + Y * Sin(R), #PB_Round_Nearest) + Axex  ;round pour un meilleur tracé
    Posy1 = Round(X * Sin(R) - Y * Cos(R), #PB_Round_Nearest) + Axey
    
    If Posx2 = 0 And Posy2 = 0 : Posx2 = Posx1 : Posy2 = Posy1 : EndIf
    
    LineXY(Posx2, Posy2, Posx1, Posy1, Couleur)
    
    Posx2 = Posx1
    Posy2 = Posy1
    
  Next o  
  
EndProcedure

Procedure chart(Axex.l, Axey.l, Xrayon.l, Yrayon.l, Rot.d, Debut.l, Fin.l, Couleur1.l,Couleur2.l)
  
  If  Debut > fin : Swap Debut , Fin : EndIf
  
  Ellipse_rotation(Axex, Axey, Xrayon, Yrayon, Rot.d, Debut, Fin, Couleur1)
  
  x.l = Axex + Xrayon * Cos(Radian(Debut))
  y.l = Axey + Yrayon * Sin(Radian(Debut))
  LineXY(Axex, Axey, x , y,  Couleur1)
  
  x = Axex + Xrayon * Cos(Radian(Fin))
  y = Axey + Yrayon * Sin(Radian(Fin))
  LineXY(Axex, Axey, x , y,  Couleur1)
  
  If  couleur1 <> couleur2
    x = Axex + (Xrayon - 2 ) * Cos(Radian(debut + (Fin - debut) / 2 ))
    y = Axey + (Yrayon - 2 ) * Sin(Radian(debut + (Fin - debut) / 2 ))
    
    FillArea(x, y, Couleur1, Couleur2)
  EndIf
  
EndProcedure  

Procedure chartman(Axex, Axey, Xrayon, Yrayon, Debut, Fin)
  
  For u = 1 To 4
    Couleur1.l = RGB(Random(255) ,Random(255), Random(255))  
    For i = 1 To 80 
      StartDrawing(CanvasOutput(0))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , 160, 240, RGB(254, 255, 255),RGB(255, 255, 255))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut - i, Fin, RGB(253, 255, 255), Couleur1)
      StopDrawing()
    Next i
    
    For i = 80 To 1 Step -1 
      StartDrawing(CanvasOutput(0))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , 160, 240, RGB(254, 255, 255),RGB(255, 255, 255))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut - i, Fin, RGB(253, 255, 255), Couleur1)
      If i = 1
        Chart(Axex, Axey, Xrayon, Yrayon, 0 , 160, 240, RGB(254, 255, 255),RGB(255, 255, 255))
      EndIf
      StopDrawing()
    Next i
  Next u
  
EndProcedure 

If OpenWindow(0, 0, 0, 500,500, "Exemple Graphique Chart animé clic souris ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 480, 480)
  
  
  StartDrawing(CanvasOutput(0))
  
  Axex.l = 232
  Axey.l = 235
  Xrayon.l = 196
  Yrayon.l = Xrayon.l
  Debut.l = 240
  Fin.l = 315
  
  Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(0, 226, 0),RGB(0, 225, 0))
  
  
  Axex = 240
  Axey = 245
  Xrayon = 200
  Yrayon = Xrayon
  Debut = - 45
  Fin = 160
  
  Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(225, 226, 0),RGB(225, 225, 0))
  
  StopDrawing()
  
  Axex = 232
  Axey = 235
  Xrayon = 196
  Yrayon = Xrayon.l
  Debut = 240
  Fin = 240
  
  chartman(Axex, Axey, Xrayon, Yrayon, Debut, Fin)
  
  Repeat
    
    Event  = WindowEvent()   
    
    If EventType() = #PB_EventType_LeftButtonDown 
      
      chartman(Axex, Axey, Xrayon, Yrayon, Debut, Fin)
      
    EndIf
    
  Until event = #PB_Event_CloseWindow
  
EndIf

Re: Rotation d'Ellipse

Publié : lun. 13/oct./2014 19:51
par Micoute
Bonsoir kernadec et merci beaucoup pour le partage !

Re: Rotation d'Ellipse

Publié : lun. 13/oct./2014 20:30
par kernadec
bonsoir Micoute
merci, mais c'est juste une petite contribution en retour de tous les codes que j'ai pu télécharger ici :wink:

[mise à jour du code précédent]
avec la mise en procédure des portions graphiques

Cordialement

Re: Rotation d'Ellipse

Publié : mar. 14/oct./2014 1:20
par kernadec
bonjour
Mise à jour du code précédent.
Correction d'un petit bug dessin :oops:
Ajout d'un test de permutation dans la procédure "Chart"
afin que l'angle du début reste inférieur à l'angle de fin.

Cordialement

Re: Rotation d'Ellipse

Publié : mar. 14/oct./2014 13:34
par Kwai chang caine
Joli ces elipses..ça me rappelle le Spirographe que j'avais failli me faire acheter quand j'etais petit :D
http://casimirus.net/01-culte-05-le-kio ... graph.html

Puis peut etre deja à l'epoque trop intellectuel pour moi, j'avais du me faire commander quelque chose de plus approprié à ma personne..
Une tenue de "Zéro" non je veux dire ZORRO :mrgreen:
Image

J'aime bien aussi le camenbert on se croirait sur EXCEL :wink:
Merci 8)

Re: Rotation d'Ellipse

Publié : mar. 14/oct./2014 19:37
par kernadec
Bonsoir KCC
je suis heureux que ce code a fromage te soit utile :D
Merci pour lien Flashback 8O :D
Cordialement

Re: Rotation d'Ellipse

Publié : mer. 15/oct./2014 5:42
par kernadec
bonjour
code précédent mis à jour
ptit délire avec l'animation des charts :D

Cordialement

Re: Rotation d'Ellipse

Publié : mer. 15/oct./2014 9:12
par Kwai chang caine
Cool !!! :lol:

Cette fois ça me rappelle

Image

Merci 8)

Re: Rotation d'Ellipse

Publié : mer. 15/oct./2014 13:14
par Micoute
Bonjour kernadec, on a intérêt à visiter souvent, car le code varie à chaque fois, merci pour le partage gracieux.

Re: Rotation d'Ellipse

Publié : jeu. 16/oct./2014 10:15
par kernadec
Bonjour

@Micoute le code exemple du 1er post est suffisant.
Cependant, il est vrai que ma première version de la procédure d'ellipse était à l'arrache,
mais en bricolant des exemples, je me suis rendu compte qu'il fallait
la rendre compatible avec les codes d'exemples, voilà pourquoi
elle a subi des mises aux points. Maintenant elle ne devrait plus changer. :wink:
et je m'excuse pour ce désagrément.

Il me faut préciser que ce post ellipse vient du fait que j'avais écrit dans le post
"Pinceaux de Mesa" que la fonction ellipse de PureBasic était incomplète,
Voilà pourquoi j'ai écrit cette procédure pour ainsi justifier cette remarque.

cordialement

Code : Tout sélectionner

Procedure Ellipse_rotation(Axex.l, Axey.l, Xrayon.l, Yrayon.l, Rot.d, Debut.l, Fin.l, Couleur.l) 
  
  Protected angle.d, R.d, X.d, Y.d, Posx1.l, Posy1.l, Posx2.l, Posy2.l
  
  R = Radian(Rot)
  
  For o = Debut To fin 
    
    Angle = Radian(o)
    
    X =  Cos(Angle) * Xrayon                          
    Y = -Sin(Angle) * Yrayon
    
    Posx1 = Round(X * Cos(R) + Y * Sin(R), #PB_Round_Nearest) + Axex  ;round pour un meilleur tracé
    Posy1 = Round(X * Sin(R) - Y * Cos(R), #PB_Round_Nearest) + Axey
    
    If Posx2 = 0 And Posy2 = 0 : Posx2 = Posx1 : Posy2 = Posy1 : EndIf
    
    LineXY(Posx2, Posy2, Posx1, Posy1, Couleur)
    
    Posx2 = Posx1
    Posy2 = Posy1
    
  Next o  
  
EndProcedure


If OpenWindow(0, 0, 0, 500,500, "Ellipses en rotation ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 480, 480)
  
  Axex.l = 240
  Axey.l = 240
  Xrayon.l = 140
  Yrayon.l = 230
  Debut.l = 0
  Fin.l = 359
  
  Repeat
    
    StartDrawing(CanvasOutput(0))
    
    ; Delay(5)
    i=Mod(i+1,360)
    Box(10, 10, 480, 480,RGB(255, 255, 255))
    Ellipse_rotation(Axex, Axey, Xrayon, Yrayon, i,     Debut, Fin, RGB(0, 0, 0))
    Ellipse_rotation(Axex, Axey, Xrayon, Yrayon, i+60,  Debut, Fin, RGB(0, 0, 0))
    Ellipse_rotation(Axex, Axey, Xrayon, Yrayon, i+120, Debut, Fin, RGB(0, 0, 0))
    
    StopDrawing()
    
  Until WindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Rotation d'Ellipse

Publié : jeu. 16/oct./2014 21:30
par kernadec
bonsoir
Autre Option faire ses Charts fun en 3D :D

Cordialement

Code : Tout sélectionner

Procedure Ellipse_rotation(Axex.l, Axey.l, Xrayon.l, Yrayon.l, Rot.d, Debut.l, Fin.l, Couleur.l) 
  
  Protected angle.d, R.d, X.d, Y.d, Posx1.l, Posy1.l, Posx2.l, Posy2.l
  
  R = Radian(Rot)
  
  For o = Debut To fin 
    
    Angle = Radian(o)
    
    x =  Cos(Angle) * Xrayon                          
    y = -Sin(Angle) * Yrayon
    
    Posx1 = Round(X * Cos(R) + Y * Sin(R), #PB_Round_Nearest) + Axex  ;round pour un meilleur tracé
    Posy1 = Round(X * Sin(R) - Y * Cos(R), #PB_Round_Nearest) + Axey
    
    If Posx2 = 0 And Posy2 = 0 : Posx2 = Posx1 : Posy2 = Posy1 : EndIf
    
    LineXY(Posx2, Posy2, Posx1, Posy1, Couleur)
    
    Posx2 = Posx1
    Posy2 = Posy1
    
  Next o  
  
EndProcedure

Procedure chart(Axex.l, Axey.l, Xrayon.l, Yrayon.l, Rot.d, Debut.l, Fin.l, Couleur1.l,Couleur2.l)
  
  If  Debut > fin : Swap Debut , Fin : EndIf
  
  Ellipse_rotation(Axex, Axey, Xrayon, Yrayon, Rot.d, Debut, Fin, Couleur1)
  
  x.l = Axex + Xrayon * Cos(Radian(Debut))
  y.l = Axey + Yrayon * Sin(Radian(Debut))
  LineXY(Axex, Axey, x , y,  Couleur1)
  
  x = Axex + Xrayon * Cos(Radian(Fin))
  y = Axey + Yrayon * Sin(Radian(Fin))
  LineXY(Axex, Axey, x , y,  Couleur1)
  
  If  couleur1 <> couleur2
    x = Axex + (Xrayon - 2 ) * Cos(Radian(debut + (Fin - debut) / 2 ))
    y = Axey + (Yrayon - 2 ) * Sin(Radian(debut + (Fin - debut) / 2 ))
    
    FillArea(x, y, Couleur1, Couleur2)
  EndIf
  
EndProcedure  

Procedure chartman(Axex, Axey, Xrayon, Yrayon, Debut, Fin)
  
  For u = 1 To 4
    Couleur1.l = RGB(Random(255) ,Random(255), Random(255))  
    
    For i = 1 To 80 
      StartDrawing(CanvasOutput(0))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , 160, 240, RGB(254, 255, 255),RGB(255, 255, 255))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut - i, Fin, RGB(253, 255, 255), Couleur1)
      
      StopDrawing()
    Next i
    
    For i = 80 To 1 Step -1 
      StartDrawing(CanvasOutput(0))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , 160, 240, RGB(254, 255, 255),RGB(255, 255, 255))
      Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut - i, Fin, RGB(253, 255, 255), Couleur1)
      
      If i = 1
        Chart(Axex, Axey, Xrayon, Yrayon, 0 , 160, 240, RGB(254, 255, 255),RGB(255, 255, 255))
      EndIf
      StopDrawing()
    Next i
  Next u
  
EndProcedure 

If OpenWindow(0, 0, 0, 500,500, "Exemple Graphique Chart 3D", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 480, 480)
  
  
  StartDrawing(CanvasOutput(0))
  
  Axex.l = 240
  Axey.l = 220
  Xrayon.l = 196
  Yrayon.l = 70
  Debut.l = 240
  Fin.l = 315
  
  For i = 1 To 16 
    Chart(Axex, i+Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(2, 182, 2),RGB(0, 180, 0))
  Next i
  Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(0, 226, 0),RGB(0, 225, 0))
  
  Axex = 250
  Axey = 245
  Xrayon = 220
  Yrayon = 72
  Debut = - 48
  Fin = 158
  
  For i = 1 To 20 
    Chart(Axex, i+Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(225, 181, 0),RGB(225, 180, 0))
  Next i
  Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(225, 226, 0),RGB(225, 225, 0))
  
  
  Axex = 210
  Axey = 225
  Xrayon = 190
  Yrayon = 70
  Debut = 162
  Fin = 240
  
  For i = 1 To 16
    Chart(Axex, i+Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(0, 100, 171),RGB(100, 0, 170))
  Next i
  Chart(Axex, Axey, Xrayon, Yrayon, 0 , Debut, Fin, RGB(0, 0, 226),RGB(0, 0,225))
  
  StopDrawing()
  
  
  Repeat
    
  Until WaitWindowEvent()  = #PB_Event_CloseWindow
  
EndIf

Re: Rotation d'Ellipse

Publié : ven. 17/oct./2014 0:56
par Frenchy Pilou
Du camembert en couleur, c'est plein de colorant! :D

Ah le Spirograph! :)
Image
Pour le fun il y a un plugin free du même nom pour Sketchup free itou! ;)
Le modeleur "box modeling" le plus facile qui existe! :)

Re: Rotation d'Ellipse

Publié : ven. 17/oct./2014 7:30
par Micoute
Bonjour kernadec, non ça n'a pas été du tout dudésagrément, je dirais même que ça a été tout le contraire.

Merci encore pour le partage.