Page 1 sur 4

Algo Black Hole Spiral

Publié : lun. 26/oct./2009 22:15
par Thyphoon
Il me semble avoir vu il y a longtemps un code qui permettait de faire une spirale style trou noir, calculé en temps réel dans le pure style demo...
Mais impossible de remettre la main dessus.
J'aurais voulu essayé de l'adapté pour essayer de rendre une image de ce genre...enfin en moin précis .... :P
A defaut si quelqu'un sait ou trouver un algo pour tracer une spirale je réinventerais la roue ... :P
Image

Re: Algo Black Hole Spiral

Publié : lun. 26/oct./2009 22:20
par Thyphoon
J'ai trouvé un algo ! reste a trouvé comment l'utilisé ... Qu'est ce que je regrette de ne pas avoir été meilleur en math a l'école lollllllll

Code : Tout sélectionner

http://fr.wikipedia.org/wiki/Spirale_logarithmique

Re: Algo Black Hole Spiral

Publié : lun. 26/oct./2009 23:20
par Backup
....

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 0:13
par Backup
....

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 0:23
par Ar-S
Dobro t'ajoutes un message subliminale et ta spirale deviendra une arme digne de 007 :mrgreen:

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 0:27
par Backup
:lol: :lol:


j'ai modifié le dernier code pour afficher une ligne a la place :)

apres ben faudrai faire un affichage complexe de texture
et on pourra la faire sa galaxie :)

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 0:35
par Backup
....

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 6:04
par Thyphoon
C'est plus qu'un debut de reponse Dobro. Merci beaucoup !
j'ai croisé ton code avec ce que j'avais fait ....

c'est pas tout a fait ça encore, mais commence a y ressembler, ça tourne dans le mauvais , sence, et le "design" n'est pas encore faire.
Bon je dois me rendre a mon boulot maintenant donc ça sera pour plus tard ....

Code : Tout sélectionner

; code by Dobro http://michel.dobro.free.fr/

#dobro=1
#Police=1
#sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    WindowID = WindowID(1)
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
    Resultat = InitMouse()
    
    Structure MyHole
    Rayon.l
    EndStructure
    Global NewList MyHole.MyHole()
    For z=1 To 640 Step 4
      AddElement(MyHole())
      MyHole()\Rayon=640-z
    Next
   
   
   
    Repeat
        ExamineMouse()
        Event=WaitWindowEvent()
        ClearScreen(RGB(0,0,0)) ;  *****<------- si tu Rem ceci le sprite laisse une trace :D
        StartDrawing( ScreenOutput()) 
        
        t.f=ElapsedMilliseconds()/10000

ForEach MyHole()
  CordX=640
  CordY=480
  x=CordX+MyHole()\Rayon*Cos(-t+ListIndex(MyHole())/10)
  y=CordY+MyHole()\Rayon/2*Sin(-t+ListIndex(MyHole())/10)
  x2=CordX+MyHole()\Rayon*Cos(#PI+-t+ListIndex(MyHole())/10)
  y2=CordY+MyHole()\Rayon/2*Sin(#PI+-t+ListIndex(MyHole())/10)
  x3=CordX+MyHole()\Rayon*Cos(#PI/2+-t+ListIndex(MyHole())/10)
  y3=CordY+MyHole()\Rayon/2*Sin(#PI/2+-t+ListIndex(MyHole())/10)
  x4=CordX+MyHole()\Rayon*Cos(#PI+#PI/2+-t+ListIndex(MyHole())/10)
  y4=CordY+MyHole()\Rayon/2*Sin(#PI+#PI/2+-t+ListIndex(MyHole())/10)

Circle(x,y,5,$ffffff)
Circle(x2,y2,5,$ffffff)
Circle(x3,y3,5,$ffffff)
Circle(x4,y4,5,$ffffff)
Next
        StopDrawing()
        FlipBuffers():; affiche l'ecran 
     
       
       
       
        Event=WindowEvent()
        If MouseButton(2)
            End
        EndIf
    Until Event=#PB_Event_CloseWindow 

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 6:06
par Thyphoon
Thyphoon a écrit :C'est plus qu'un debut de reponse Dobro. Merci beaucoup !
j'ai croisé ton code avec ce que j'avais fait ....

c'est pas tout a fait ça encore, mais commence a y ressembler, ça tourne dans le mauvais , sence, et le "design" n'est pas encore faire.
Bon je dois me rendre a mon boulot maintenant donc ça sera pour plus tard ....
Edit : voilà ça tourne dans le bon sens et la vitesse est mieux ..... :P

Code : Tout sélectionner

; code by Dobro http://michel.dobro.free.fr/

#dobro=1
#Police=1
#sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    WindowID = WindowID(1)
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
    Resultat = InitMouse()
    
    Structure MyHole
    Rayon.l
    EndStructure
    Global NewList MyHole.MyHole()
    For z=1 To 640 Step 4
      AddElement(MyHole())
      MyHole()\Rayon=640-z
    Next
   
   
   
    Repeat
        ExamineMouse()
        Event=WaitWindowEvent()
        ClearScreen(RGB(0,0,0)) ;  *****<------- si tu Rem ceci le sprite laisse une trace :D
        StartDrawing( ScreenOutput()) 
        
        t.f=ElapsedMilliseconds()/40000

ForEach MyHole()
  CordX=640
  CordY=480
  x=CordX+MyHole()\Rayon*Cos(t+ListIndex(MyHole())/10)
  y=CordY+MyHole()\Rayon/2*Sin(t+ListIndex(MyHole())/10)
  x2=CordX+MyHole()\Rayon*Cos(#PI+t+ListIndex(MyHole())/10)
  y2=CordY+MyHole()\Rayon/2*Sin(#PI+t+ListIndex(MyHole())/10)
  x3=CordX+MyHole()\Rayon*Cos(#PI/2+t+ListIndex(MyHole())/10)
  y3=CordY+MyHole()\Rayon/2*Sin(#PI/2+t+ListIndex(MyHole())/10)
  x4=CordX+MyHole()\Rayon*Cos(#PI+#PI/2+t+ListIndex(MyHole())/10)
  y4=CordY+MyHole()\Rayon/2*Sin(#PI+#PI/2+t+ListIndex(MyHole())/10)

Circle(x,y,5,$ffffff)
Circle(x2,y2,5,$ffffff)
Circle(x3,y3,5,$ffffff)
Circle(x4,y4,5,$ffffff)
Next
        StopDrawing()
        FlipBuffers():; affiche l'ecran 
     
       
       
       
        Event=WindowEvent()
        If MouseButton(2)
            End
        EndIf
    Until Event=#PB_Event_CloseWindow  

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 8:49
par Thyphoon
On s'approche du but ! voici l'image
Image

je ne sais pas trop comment faire pour que le sprite deviennent de plus en plus blanc au fur et a mesure qu'il se rapproche du centre ....
Et il me reste a placé des étoiles ...

Toute suggestion, idée, proposition est la bienvenu pour améliorer ce code !

Code : Tout sélectionner

; code by Dobro http://michel.dobro.free.fr/
UsePNGImageDecoder()
#dobro=1
#Police=1
#sprite=1
; ***********************************
InitSprite()
InitSprite3D()
InitKeyboard()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    WindowID = WindowID(1)
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
     Debug FileSize("Gfx/holehand.png")
    LoadSprite(1,"Gfx/holehand.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
      CreateSprite3D(1,1)

      
    
    Structure MyHole
    Rayon.l
    EndStructure
    Global NewList MyHole.MyHole()
    NbStar=120
    For z=NbStar To 1 Step -1
      AddElement(MyHole())
      MyHole()\Rayon=Pow(z,1.3)*(EcranX/4)/(NbStar*2)
    Next
   
   
   
    Repeat
        ExamineKeyboard()
        Event=WindowEvent()
        Delay(1)
        ClearScreen(RGB(0,0,0)) ;  *****<------- si tu Rem ceci le sprite laisse une trace :D
        ;StartDrawing( ScreenOutput()) 
        Start3D()
        t.f=ElapsedMilliseconds()/10000

ForEach MyHole()
  CordX=EcranX/2
  CordY=EcranY/2
  x=CordX+MyHole()\Rayon*Cos(t+ListIndex(MyHole())/10)
  y=CordY+MyHole()\Rayon/2*Sin(t+ListIndex(MyHole())/10)
  x2=CordX+MyHole()\Rayon*Cos(#PI+t+ListIndex(MyHole())/10)
  y2=CordY+MyHole()\Rayon/2*Sin(#PI+t+ListIndex(MyHole())/10)
  x3=CordX+MyHole()\Rayon*Cos(#PI/2+t+ListIndex(MyHole())/10)
  y3=CordY+MyHole()\Rayon/2*Sin(#PI/2+t+ListIndex(MyHole())/10)
  x4=CordX+MyHole()\Rayon*Cos(#PI+#PI/2+t+ListIndex(MyHole())/10)
  y4=CordY+MyHole()\Rayon/2*Sin(#PI+#PI/2+t+ListIndex(MyHole())/10)

size=(ListSize(MyHole())-ListIndex(MyHole()))*128/ListSize(MyHole())
Angle=(ListSize(MyHole())-ListIndex(MyHole()))*360/ListSize(MyHole())
Alpha=255-((ListSize(MyHole())-ListIndex(MyHole()))*255/ListSize(MyHole()))
ZoomSprite3D(1,size,size)
RotateSprite3D(1,Angle,#PB_Absolute)
DisplaySprite3D(1,x,y,Alpha)
DisplaySprite3D(1,x2,y2,Alpha)
DisplaySprite3D(1,x3,y3,Alpha)
DisplaySprite3D(1,x4,y4,Alpha)
Next
Stop3D()
        ;StopDrawing()
        FlipBuffers():; affiche l'ecran 
     
       
       
       
        Event=WindowEvent()
         If KeyboardPushed(#PB_Key_Escape)
            End
        EndIf
    Until Event=#PB_Event_CloseWindow 

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 14:00
par Backup
excellent ! :)

pour tes prochains code si tu pouvais mettre

Code : Tout sélectionner

ForEach MyHole()
                CordX=EcranX/2
                CordY=EcranY/2
mes variable Ecranx et ecrany contiennent la résolution de l'ecran sur lequel
est lancé le prg , j'utilise mon nc10 (1024X600)

et si tu remplace par mes petite lignes, ça marchera chez tout le monde :)

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 14:47
par Thyphoon
Ok ! j'ai modifié dans le code précédent !
J'ai pas eu le temps de continuer dessus...mais des que je peux je vais essayer de rajouter le centre, et les etoiles.
Tu as une idée pour faire pencher la spirale comme sur le dessin posté en haut :P ? j'ai essayer mais je dois me planter dans mes calcules ...Enfin je vais voir ça ...

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 17:06
par Backup
.....

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 17:34
par Thyphoon
Super merci ! Je comprends maintenant pourquoi j'y arrivait pas je rajoutais un angle a l'angle d'origine sur la spiral...donc c'est le point qui était un peu plus prêt du noyaux, mais pas la spiral en elle même qui pivotait...
J'ai fait une petite correction sur ton code pour centrer notre superbe spiral !

et voici pour le centre de la spiral ...Image
Le hic ! je me demande si je vais pas être obligé de stocké tout les points et de les triers pour que le centre soit au centre ... a moins de trouver une astuce.
J'ai fait plein de test pour rajouter les étoiles dans les bras de la spiral mais rien de bien... que du tres moche !!! :(

En tout cas merci Dobro sans toi j'en serais pas encore là lolllllllll Je me suis vraiment rouillé en Trigo moi ! :oops:

Code : Tout sélectionner

UsePNGImageDecoder()
#dobro=1
#Police=1
#sprite=1
; ***********************************
InitSprite()
InitSprite3D()
InitKeyboard()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    WindowID = WindowID(1)
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
     Debug FileSize("Gfx/holehand.png")
    LoadSprite(1,"Gfx/holehand.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(1,1)
    LoadSprite(2,"Gfx/sun.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(2,2)

      
    
    Structure MyHole
    Rayon.l
    EndStructure
    Global NewList MyHole.MyHole()
    NbStar=120
    For z=NbStar To 1 Step -1
      AddElement(MyHole())
      MyHole()\Rayon=Pow(z,1.3)*(EcranX/4)/(NbStar*2)
    Next
   
   degres=-15
   Coef=10
    Repeat
        ExamineKeyboard()
        Event=WindowEvent()
        Delay(1)
        ClearScreen(RGB(0,0,0)) ;  *****<------- si tu Rem ceci le sprite laisse une trace :D
        ;StartDrawing( ScreenOutput()) 
        Start3D()
        t.f=ElapsedMilliseconds()/10000
          CordX=EcranX/2
  CordY=EcranY/2
   
ForEach MyHole()

  x=MyHole()\Rayon*Cos(t+ListIndex(MyHole())/Coef)
  y=MyHole()\Rayon/2*Sin(t+ListIndex(MyHole())/Coef)
  x2=MyHole()\Rayon*Cos(#PI+t+ListIndex(MyHole())/Coef)
  y2=MyHole()\Rayon/2*Sin(#PI+t+ListIndex(MyHole())/Coef)
  x3=MyHole()\Rayon*Cos(#PI/2+t+ListIndex(MyHole())/Coef)
  y3=MyHole()\Rayon/2*Sin(#PI/2+t+ListIndex(MyHole())/Coef)
  x4=MyHole()\Rayon*Cos(#PI+#PI/2+t+ListIndex(MyHole())/Coef)
  y4=MyHole()\Rayon/2*Sin(#PI+#PI/2+t+ListIndex(MyHole())/Coef)

; ********* voici la formule de la rotation d'image *********
  ;<------------ en degres !!! :o)
   x= x * Cos (degres* #PI /180) +( Y)* Sin (degres* #PI /180)
   Y=x * Sin (degres* #PI /180) + (Y)* Cos (degres* #PI /180) 
             
   x2= x2 * Cos (degres* #PI /180) +( y2)* Sin (degres* #PI /180)
   y2= x2 * Sin (degres* #PI /180) + (y2)* Cos (degres* #PI /180) 
               
   x3= x3 * Cos (degres* #PI /180) +( y3)* Sin (degres* #PI /180)
   y3= x3 * Sin (degres* #PI /180) + (y3)* Cos (degres* #PI /180) 
               
   x4= x4 * Cos (degres* #PI /180) +( Y4)* Sin (degres* #PI /180)
   Y4= x4 * Sin (degres* #PI /180) + (Y4)* Cos (degres* #PI /180) 
               
              ;***************************************************** 

size=(ListSize(MyHole())-ListIndex(MyHole()))*128/ListSize(MyHole())
Angle=(ListSize(MyHole())-ListIndex(MyHole()))*360/ListSize(MyHole())
Alpha=255-((ListSize(MyHole())-ListIndex(MyHole()))*255/ListSize(MyHole()))
ZoomSprite3D(1,size,size)
RotateSprite3D(1,Angle,#PB_Absolute)
DisplaySprite3D(1,CordX+x-Size/2,CordY+y-Size/2,Alpha)
DisplaySprite3D(1,CordX+x2-Size/2,CordY+y2-Size/2,Alpha)
DisplaySprite3D(1,CordX+x3-Size/2,CordY+y3-Size/2,Alpha)
DisplaySprite3D(1,CordX+x4-Size/2,CordY+y4-Size/2,Alpha)
Next
;Sprite3DBlendingMode(12,6)
DisplaySprite3D(2,CordX-SpriteWidth(2)/2,Cordy-SpriteHeight(2)/2,255)
Stop3D()
        ;StopDrawing()
               StartDrawing(ScreenOutput())
        DrawText(10,10,Str(degres),$ffffff)
       StopDrawing()
        FlipBuffers():; affiche l'ecran 
     

        Event=WindowEvent()
         If KeyboardPushed(#PB_Key_Escape)
            End
        EndIf
        
        If KeyboardReleased(#PB_Key_Down) And degres>-45
          degres=degres-1
        EndIf 
        
        If KeyboardReleased(#PB_Key_Up) And degres<50
          degres=degres+1
        EndIf 
        
    Until Event=#PB_Event_CloseWindow

Re: Algo Black Hole Spiral

Publié : mar. 27/oct./2009 17:58
par Backup
:) pas mal le coup des touches pour changer la rotation :)


tu sais moi la trigo j'en ai jamais fait ..
l'essai et l'erreur sont la meilleurs façon d'apprendre :)


j'ai vu que tu as ajouté une image "sun.png", tu nous la met sur le forum ? :)