Page 1 sur 1

Super code d'EINANDER !!!

Publié : dim. 13/mars/2011 20:14
par Kwai chang caine
Salut à tous si ça c'est pas splendide....alors j'y connais rien en 3D... 8O
(En fait..j'y connais rien en 3D) :mrgreen:

Je pense que ce code de EINANDER "mérite" le forum français à plusieurs titres 8)
http://www.purebasic.fr/english/viewtop ... 32#p348832

Code : Tout sélectionner

#SquaredShape=0
    #RhombShape=1
    EnableExplicit
    Define i,wi,he, ev,Fon,Img,ImGad
    Global _FastMode=#False ; less fun if set to #True
    Global _drawing
    DisableDebugger ; with debugger on, slow drawing

    Macro MMK
       Abs(GetAsyncKeyState_(#VK_LBUTTON) +GetAsyncKeyState_(#VK_RBUTTON)*2+GetAsyncKeyState_(#VK_MBUTTON)*3)/$8000   
    EndMacro


    Procedure CAux(Array Arr.Point(1),X,Y,A,B,Rgb,N)
       If Point(X,Y)=RGB And Point(A,B)<>Rgb
          Arr(N)\X=x :   Arr(N)\Y=y
          N+1
       EndIf
       ProcedureReturn N
    EndProcedure

    Procedure Outline(Array Arr.Point(1),Img,Rgb=0,Rhomb=0)
       ;ret Arr con outline de rgb
       Protected I,X,Y,N
       Protected Iwi=ImageWidth(Img)-2
       Protected Ihe=ImageHeight(Img)-2
       Dim arr(iwi*ihe)
       For X=1 To Iwi
          For y=1 To Ihe
             If Rhomb=1 Or (Rhomb=2 And 1&Y)     ; if Odd(y)
                N=CAux(Arr(),X,Y,X-1,Y  ,Rgb,N)   ; left
                N=CAux(Arr(),X,Y,X  ,Y-1,Rgb,N)   ; top
                N=CAux(Arr(),X,Y,X+1,Y  ,Rgb,N)   ; right
                N=CAux(Arr(),X,Y,X  ,Y+1,Rgb,N)   ; bottom
             EndIf
             If Rhomb=0 Or (Rhomb=2 And Not(1&Y)) ; if Even(Y)
                N=CAux(Arr(),X,Y,X-1,Y-1,Rgb,N)  ; left top
                N=CAux(Arr(),X,Y,X-1,Y+1,Rgb,N)  ; left bottom
                N=CAux(Arr(),X,Y,X+1,Y-1,Rgb,N)  ; top right
                N=CAux(Arr(),X,Y,X+1,Y+1,Rgb,N)  ; bottom right
             EndIf
          Next
       Next
       ReDim arr(n-1)   
    EndProcedure


    ;Test it <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    Procedure BallDraw(img,imgad,X,Y,Array Arr.Point(1),Rgb1,Rgb2,Radius)
       Protected I,X1,Y1,R2=Radius/2,ev
       If _Fastmode
          DrawingMode(#PB_2DDrawing_Gradient)
          FrontColor(Rgb2) : BackColor(Rgb1)
         
          For I=0 To ArraySize(Arr())-1
             X1=Arr(I)\X : Y1=Arr(I)\Y
             LinearGradient(X1-R2,Y1-R2,X1+R2,Y1+R2)   
             Circle(X1,Y1,Radius)
          Next
       Else
          While Mmk:WindowEvent():Wend
          For I=0 To ArraySize(Arr())-1
             If GetAsyncKeyState_(27)&$8000 :  End : EndIf
             WindowEvent()
             If Mmk :Break:EndIf ; stop drawing and return if left mouse click
             
             If _Drawing:StopDrawing():EndIf
             _Drawing=StartDrawing(ImageOutput(Img))
             DrawingMode(#PB_2DDrawing_Gradient)
             FrontColor(Rgb2) : BackColor(Rgb1)
             
             X1=Arr(I)\X : Y1=Arr(I)\Y
             LinearGradient(X1-R2,Y1-R2,X1+R2,Y1+R2)   
             Circle(X1,Y1,Radius)
             StopDrawing():_Drawing=0
             SetGadgetState(Imgad,ImageID(Img))
          Next
       EndIf
    EndProcedure


    Procedure TestDraw(img,imgad,rgb1,rgb2,radius)
       Protected RGB,j
       Dim arr.point(0)
       _drawing=StartDrawing(ImageOutput(Img))
       Outline(arr(),Img,0,#RhombShape) ; try #SquaredShape <<<<<<<<<<
       RGB=Random(#White)
       balldraw(img,imgad,arr(j)\x,arr(j)\y,arr(),rgb1,rgb2,radius)         
       StopDrawing():_drawing=0
       SetGadgetState(Imgad,ImageID(Img))
    EndProcedure

    OpenWindow(0, 100, 100,1000,320 ,"Get Outline _ Double click on Close Window to Quit",    #PB_Window_SystemMenu  |1)
    Wi=WindowWidth(0):He=WindowHeight(0)
    Fon=LoadFont(-1,"times new roman",70)  ; try different fonts and sizes
    Img=CreateImage(-1,Wi,He)
    Imgad=ImageGadget(-1,0,0,0,0,ImageID(Img))
    StartDrawing(ImageOutput(Img))
    DrawingFont(FontID(Fon))
    DrawingMode(#PB_2DDrawing_Outlined)
    DrawText(100,90,"P u r e  B a s i c",Random(#White),0)
    StopDrawing()
    SetGadgetState(Imgad,ImageID(Img))
    testdraw(img,imgad,#Yellow,$55,6) ; last parameter= radius: small values or very slow drawing
    Repeat
       ev= WaitWindowEvent(1)
       If i<10
          testdraw(img,imgad,Random(#White),Random(#White),i)
          i+1   
       SetWindowTitle(0,Str(i))   
       EndIf
    Until ev=#PB_Event_CloseWindow

Re: Super code d'EINANDER !!!

Publié : lun. 14/mars/2011 23:47
par stombretrooper
Effectivement le rendus est impressionnant ! :)

Re: Super code d'EINANDER !!!

Publié : mar. 15/mars/2011 0:02
par Warkering
C'est vrai que c'est plutôt chouette, un bel effet! :)

Re: Super code d'EINANDER !!!

Publié : dim. 20/mars/2011 19:23
par Fig
Sympa oui, mais c'est de la 3D, tu es sûr ?? :?:

Re: Super code d'EINANDER !!!

Publié : dim. 20/mars/2011 19:48
par Kwai chang caine
Bah comme je l'ai dit au debut, j'y connais fifre en 3D
Moi j'appelle ça 3D parce que y'a un effet de relief....mais ce serait de la 5D ce serait pareil pour moi :lol: :oops:

Re: Super code d'EINANDER !!!

Publié : jeu. 14/juil./2011 5:09
par Anonyme2
En voilà un autre vraiment époustouflant de EINANDER, je lui tire mon chapeau !
et que 260 lignes ...

http://www.purebasic.fr/english/viewtop ... 12&t=46830