Page 1 sur 2

une tres belle loupe

Publié : ven. 08/juil./2005 18:23
par kelly
comme vous etes sympa, voici une de mes oeuvres (a compiler pour que ca ne rame pas)

Code : Tout sélectionner

InitSprite()     ;Initialise le moteur gérant l'ecran et les sprites
InitSprite3D()     ;Initialise le moteur gérant l'ecran et les sprites
InitMouse()
InitKeyboard()     ;Initialise le moteur gérant les accès claviers
UseJPEGImageDecoder() 
Dim r.w(2048,1536)
Dim v.w(2048,1536)
Dim b.w(2048,1536)
Dim p(1024*768)

OpenScreen(1024,768,32,"")     ;Ouvre un ecran de 800x600x32 dont le nom est ""

LoadSprite(0,"image 1024*768*16M.jpg")     ;On charge le sprite N°0 en mémoire ( fond d'écran 800x600 )
DisplaySprite(0,0,0)     ;On affiche le sprite modifié
StartDrawing(SpriteOutput(0))

For u=0 To 767
For i=0 To 1023
x=Point(i,u)
r(512+i,384+u)=Red(x)
v(512+i,384+u)=Green(x)
b(512+i,384+u)=Blue(x)
Next
Next
StopDrawing()
FreeSprite(0)
CloseScreen()

;;;;;;;;;;;;;;;;;;;;;*;*;*;*;*;*;*;;;;;;;;;;;;;;;;;;;;;;;

OpenScreen(1024,768,32,"")     ;Ouvre un ecran de 800x600x32 dont le nom est ""

Dim zoom0.f(200)
Dim zoom02.f(200)
Dim trans(200)

gro=130

zoom0(0)=0
For i=0 To 200
zoom0(i)=Sin(i/300)+Cos(i/90)
trans(i)=gro
Next

bx.f=0
cx.f=0.0000005
zoom02(0)=0
For i=0 To 200
zoom02(i)=bx
trans(i)=gro
bx+0.002+cx
cx*1.1
Next

Dim zx(200,200)
Dim zy(200,200)
Dim zx2(200,200)
Dim zy2(200,200)
For i=0 To gro
For u=0 To gro
x0=Sqr(i*i+u*u)
If x0<=gro
zx(i,u)=i*(1+zoom0(x0))
zy(i,u)=u*(1+zoom0(x0))
zx2(i,u)=i*(1+zoom02(x0))
zy2(i,u)=u*(1+zoom02(x0))
Else
If trans(i)=gro
trans(i)=u-1
EndIf
EndIf
Next
Next


Dim zoom(200)
Dim zoom2(200)
For i=0 To 200
zoom(i)=zoom0(i)
zoom2(i)=zoom02(i)
Next
Dim zoom0.f(1)
Dim zoom02.f(1)




xxx=0
yyy=0

xx0.f=0.22
xx1.f=0.31

Repeat
ClearScreen (0,0,0)

xxx0=640+Cos(xx0)*370-gro
yyy0=480+Sin(xx1)*220-gro

xx0+0.0292
xx1+0.046

StartDrawing(ScreenOutput())

For u=0 To gro
For i=0 To trans(u)

zx=zx(i,u)
zy=zy(i,u)
rx=511+xxx0-xxx+zx
ry=383+yyy0-yyy+zy


zx2=zx2(i,u)
zy2=zy2(i,u)
rx2=511+xxx0-xxx+zx2
ry2=383+yyy0-yyy+zy2


Plot (xxx0+i,yyy0+u,RGB((r(rx,ry)+r(rx2,ry2)*3)/4,(v(rx,ry)+v(rx2,ry2)*3)/4,(b(rx,ry)+b(rx2,ry2)*3)/4))
rx-zx*2
rx2-zx2*2
Plot (xxx0-i,yyy0+u,RGB((r(rx,ry)+r(rx2,ry2)*3)/4,(v(rx,ry)+v(rx2,ry2)*3)/4,(b(rx,ry)+b(rx2,ry2)*3)/4))
ry-zy*2
ry2-zy2*2
Plot (xxx0-i,yyy0-u,RGB((r(rx,ry)+r(rx2,ry2)*3)/4,(v(rx,ry)+v(rx2,ry2)*3)/4,(b(rx,ry)+b(rx2,ry2)*3)/4))
rx+zx*2
rx2+zx2*2
Plot (xxx0+i,yyy0-u,RGB((r(rx,ry)+r(rx2,ry2)*3)/4,(v(rx,ry)+v(rx2,ry2)*3)/4,(b(rx,ry)+b(rx2,ry2)*3)/4))


Next
Next



StopDrawing()

FlipBuffers()     ;On inverse le Buffer ( notion que l'on verra + tard )

;ClearScreen (0,0,0)
ExamineKeyboard() : Until KeyboardPushed(#PB_Key_Escape): End

ps : utilisez une de vos images :wink:

Publié : ven. 08/juil./2005 21:44
par kelly
vous en pensez koi au fait ???? :?: :?: :?: :?: :?:

Publié : ven. 08/juil./2005 23:09
par Dr. Dri
ca plante chez moi en mde compile/run
quand je fais un exe j'ai un disque blanc avec des trucs gris quand ca s'approche des bords

Dri

Publié : ven. 08/juil./2005 23:14
par Torp
Sympa, ça le fait bien! faut juste penser à mettre une image en fond. Chez moi ca plante pas.

Publié : sam. 09/juil./2005 22:36
par Le Soldat Inconnu
idem que Dri, j'ai pourtant mis une image de fond mais j'ai juste un cercle blanc

Publié : sam. 09/juil./2005 23:12
par Dr. Dri
J'ai testé sur mon autre PC où les sprite3D ont tendance à tres bien marcher mais toujours ce cercle blanc...

Dri

Publié : dim. 10/juil./2005 3:32
par kelly
http://w404.free.fr/loupe
Prenez ces 2 fichiers. La, c'est clair, si ca marche pas chez vous, je ne pige pas (car precedement, je me demande si vous n'avez pas pris une image jpg au mauvais format !). Sinon, vous n'avez peut etre pas la version 3.91 de PB, ce qui expliquerait peut etre votre bug... j'avoue que j'en sais rien
:roll:

ps: la loupe reagit avec la souris cette fois ci.

question : est ce qu'avec la version 3.93 de PB on peux mettre des plot en (-1,-1,0) sans que ca plante ???

Publié : dim. 10/juil./2005 7:28
par comtois
Pour tester il faut une image de dimension 1024x768 , j'ai testé avec une image de dimension 128x128 et effectivement je vois le cercle blanc dans ce cas :)

Pour pallier à ça il faudrait que le programme prenne en compte la dimension du sprite chargé

exemple

Code : Tout sélectionner

For u=0 To 767
    For i=0 To 1023
        x=Point(i,u)
        r(512+i,384+u)=Red(x)
        v(512+i,384+u)=Green(x)
        b(512+i,384+u)=Blue(x)
    Next
Next
pourrait être remplacé par

Code : Tout sélectionner

SpriteH  = SpriteHeight(0)-1
SpriteW  = SpriteWidth(0)-1
SpriteH2 = SpriteHeight(0)/2
SpriteW2 = SpriteWidth(0)/2

For u=0 To SpriteH
    For i=0 To SpriteW
        x=Point(i,u)
        r(SpriteW2+i,SpriteH2+u)=Red(x)
        v(SpriteW2+i,SpriteH2+u)=Green(x)
        b(SpriteW2+i,SpriteH2+u)=Blue(x)
    Next
Next

Sinon j'ai testé l'exe , et ça fonctionne très bien , il y a même les reflets sur la loupe 8O

Publié : dim. 10/juil./2005 7:47
par kelly
comtois a écrit :Sinon j'ai testé l'exe , et ça fonctionne très bien , il y a même les reflets sur la loupe 8O
Oui, j'ai codé des reflets; comme si la loupe etait en fait une sphere legerement transparente qui montre aussi le maping collé a l'arriere de la sphere :wink:
Par contre, c'est rapide ?? (car moi, j'ai un 2000+ et ca saccade un peu)

ps : les "plot" ont un equivalent en D3D/open GL ??

Publié : dim. 10/juil./2005 8:54
par comtois
je n'ai pas testé pour vérifier si c'était plus lent ou plus rapide, à l'oeil je ne vois pas de différence sur mon pc .

J'ai supprimé un openscreen() qui ne servait à rien et remplacé les plots par des PokeL() .
Je conserve le sprite pour effacer l'écran , plutôt qu'un ClearScreen() , ça rend pas mal aussi comme ça :)
la loupe se balade sur l'image complète.

Code : Tout sélectionner

InitSprite()     ;Initialise le moteur gérant l'ecran et les sprites
InitSprite3D()     ;Initialise le moteur gérant l'ecran et les sprites
InitMouse()
InitKeyboard()     ;Initialise le moteur gérant les accès claviers
OpenScreen(1024,768,32,"")     ;Ouvre un ecran de 800x600x32 dont le nom est ""
UseJPEGImageDecoder()

LoadSprite(0,"pic.jpg")     ;On charge le sprite N°0 en mémoire ( fond d'écran 800x600 )

SpriteH  = SpriteHeight(0)-1
SpriteW  = SpriteWidth(0)-1
SpriteH2 = SpriteHeight(0)/2
SpriteW2 = SpriteWidth(0)/2

Dim r.w(SpriteWidth(0)*2,SpriteHeight(0)*2)
Dim v.w(SpriteWidth(0)*2,SpriteHeight(0)*2)
Dim b.w(SpriteWidth(0)*2,SpriteHeight(0)*2)
Dim p(SpriteWidth(0)*SpriteHeight(0))

StartDrawing(SpriteOutput(0))

For u=0 To SpriteH
    For i=0 To SpriteW
        x=Point(i,u)
        r(SpriteW2+i,SpriteH2+u)=Red(x)
        v(SpriteW2+i,SpriteH2+u)=Green(x)
        b(SpriteW2+i,SpriteH2+u)=Blue(x)
    Next
Next
StopDrawing()

;FreeSprite(0)

Dim zoom0.f(200)
Dim zoom02.f(200)
Dim trans(200)

gro=130

zoom0(0)=0
For i=0 To 200
    zoom0(i)=Sin(i/300)+Cos(i/90)
    trans(i)=gro
Next

bx.f=0
cx.f=0.0000005
zoom02(0)=0
For i=0 To 200
    zoom02(i)=bx
    trans(i)=gro
    bx+0.002+cx
    cx*1.1
Next

Dim zx(200,200)
Dim zy(200,200)
Dim zx2(200,200)
Dim zy2(200,200)
For i=0 To gro
    For u=0 To gro
        x0=Sqr(i*i+u*u)
        If x0<=gro
            zx(i,u)=i*(1+zoom0(x0))
            zy(i,u)=u*(1+zoom0(x0))
            zx2(i,u)=i*(1+zoom02(x0))
            zy2(i,u)=u*(1+zoom02(x0))
        Else
            If trans(i)=gro
                trans(i)=u-1
            EndIf
        EndIf
    Next
Next


Dim zoom(200)
Dim zoom2(200)
For i=0 To 200
    zoom(i)=zoom0(i)
    zoom2(i)=zoom02(i)
Next
Dim zoom0.f(1)
Dim zoom02.f(1)

xxx=0
yyy=0

xx0.f=0.22
xx1.f=0.31

Repeat

    FlipBuffers()   
    ; ClearScreen (0,0,0)
    DisplaySprite(0,0,0)
    
    xxx0=640+Cos(xx0)*370-gro
    yyy0=480+Sin(xx1)*220-gro
    
    xx0+0.0292
    xx1+0.046
    
    StartDrawing(ScreenOutput())
    adr = DrawingBuffer()
    Pitch = DrawingBufferPitch()/4
    StopDrawing()
    
    For u=0 To gro
        For i=0 To trans(u)
            
            zx=zx(i,u)
            zy=zy(i,u)
            rx=511+xxx0-xxx+zx
            RY=383+yyy0-yyy+zy
            
            
            zx2=zx2(i,u)
            zy2=zy2(i,u)
            rx2=511+xxx0-xxx+zx2
            ry2=383+yyy0-yyy+zy2
            
            PokeL(adr + (xxx0+i + (Pitch * (yyy0+u)))*4,RGB((b(rx,RY)+b(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(r(rx,RY)+r(rx2,ry2)*3)/4))
            ;Plot (xxx0+i,yyy0+u,RGB((r(rx,RY)+r(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(b(rx,RY)+b(rx2,ry2)*3)/4))
            rx-zx*2
            rx2-zx2*2
            PokeL(adr + (xxx0-i + (Pitch * (yyy0+u)))*4,RGB((b(rx,RY)+b(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(r(rx,RY)+r(rx2,ry2)*3)/4))
            ;Plot (xxx0-i,yyy0+u,RGB((r(rx,RY)+r(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(b(rx,RY)+b(rx2,ry2)*3)/4))
            RY-zy*2
            ry2-zy2*2
            PokeL(adr + (xxx0-i + (Pitch * (yyy0-u)))*4,RGB((b(rx,RY)+b(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(r(rx,RY)+r(rx2,ry2)*3)/4)) 
            ;Plot (xxx0-i,yyy0-u,RGB((r(rx,RY)+r(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(b(rx,RY)+b(rx2,ry2)*3)/4))
            rx+zx*2
            rx2+zx2*2
            PokeL(adr + (xxx0+i + (Pitch * (yyy0-u)))*4,RGB((b(rx,RY)+b(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(r(rx,RY)+r(rx2,ry2)*3)/4))
            ;Plot (xxx0+i,yyy0-u,RGB((r(rx,RY)+r(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(b(rx,RY)+b(rx2,ry2)*3)/4))
            
            
        Next
    Next

    ExamineKeyboard() 
    
Until KeyboardPushed(#PB_Key_Escape)
End

Publié : dim. 10/juil./2005 10:47
par Dr. Dri
Avec les modifs de comtois ca fonctionne ^^
Sympa mais très lent...

Dri

Publié : dim. 10/juil./2005 11:49
par nico
J'ai une erreur :

PokeL(adr + (xxx0+i + (Pitch * (yyy0+u)))*4,RGB((b(rx,RY)+b(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(r(rx,RY)+r(rx2,ry2)*3)/4))

Array index out of bounds.

Publié : dim. 10/juil./2005 12:31
par comtois
Dr.Dri a écrit :Avec les modifs de comtois ca fonctionne ^^
Sympa mais très lent...
Bizarre , le code original fonctionne bien avec l'image de kelly.
J'ai juste supprimé un openscreen() et en principe mes pokeL() devrait faire exactement la même chose que les plots,donc je n'ai rien changé de particulier .
Nico a écrit :J'ai une erreur :

PokeL(adr + (xxx0+i + (Pitch * (yyy0+u)))*4,RGB((b(rx,RY)+b(rx2,ry2)*3)/4,(v(rx,RY)+v(rx2,ry2)*3)/4,(r(rx,RY)+r(rx2,ry2)*3)/4))

Array index out of bounds.
Bizarre , je n'ai pas cette erreur , tu as testé avec l'image proposée par Kelly ?

je n'ai pas fait de test avec d'autres images .

Et puis les modifs que je propose c'est juste des pistes à explorer , je laisse à kelly le soin de reprendre ou non son code :)

allez dernière proposition :

Code : Tout sélectionner

InitSprite()     ;Initialise le moteur gérant l'ecran et les sprites
InitSprite3D()     ;Initialise le moteur gérant l'ecran et les sprites
InitMouse()
InitKeyboard()     ;Initialise le moteur gérant les accès claviers
OpenScreen(1024,768,32,"")     ;Ouvre un ecran de 800x600x32 dont le nom est ""
UseJPEGImageDecoder()

LoadSprite(0,"pic.jpg")     ;On charge le sprite N°0 en mémoire ( fond d'écran 800x600 )

SpriteH  = SpriteHeight(0)-1
SpriteW  = SpriteWidth(0)-1
SpriteH2 = SpriteHeight(0)/2
SpriteW2 = SpriteWidth(0)/2

Dim r.w(SpriteWidth(0)*2,SpriteHeight(0)*2)
Dim v.w(SpriteWidth(0)*2,SpriteHeight(0)*2)
Dim b.w(SpriteWidth(0)*2,SpriteHeight(0)*2)
Dim p(SpriteWidth(0)*SpriteHeight(0))

StartDrawing(SpriteOutput(0))

For u=0 To SpriteH
    For i=0 To SpriteW
        x=Point(i,u)
        r(SpriteW2+i,SpriteH2+u)=Red(x)
        v(SpriteW2+i,SpriteH2+u)=Green(x)
        b(SpriteW2+i,SpriteH2+u)=Blue(x)
    Next
Next
StopDrawing()

;FreeSprite(0)

Dim zoom0.f(200)
Dim zoom02.f(200)
Dim trans(200)

gro=130

zoom0(0)=0
For i=0 To 200
    zoom0(i)=Sin(i/300)+Cos(i/90)
    trans(i)=gro
Next

bx.f=0
cx.f=0.0000005
zoom02(0)=0
For i=0 To 200
    zoom02(i)=bx
    trans(i)=gro
    bx+0.002+cx
    cx*1.1
Next

Dim zx(200,200)
Dim zy(200,200)
Dim zx2(200,200)
Dim zy2(200,200)
For i=0 To gro
    For u=0 To gro
        x0=Sqr(i*i+u*u)
        If x0<=gro
            zx(i,u)=i*(1+zoom0(x0))
            zy(i,u)=u*(1+zoom0(x0))
            zx2(i,u)=i*(1+zoom02(x0))
            zy2(i,u)=u*(1+zoom02(x0))
        Else
            If trans(i)=gro
                trans(i)=u-1
            EndIf
        EndIf
    Next
Next


Dim zoom(200)
Dim zoom2(200)
For i=0 To 200
    zoom(i)=zoom0(i)
    zoom2(i)=zoom02(i)
Next
Dim zoom0.f(1)
Dim zoom02.f(1)

xxx=0
yyy=0

xx0.f=0.22
xx1.f=0.31

Repeat
    
    FlipBuffers()   
    ; ClearScreen (0,0,0)
    DisplaySprite(0,0,0)
    
    xxx0=640+Cos(xx0)*370-gro
    yyy0=480+Sin(xx1)*220-gro

    xx0+0.0292
    xx1+0.046
    
    StartDrawing(ScreenOutput())
    adr = DrawingBuffer()
    Pitch = DrawingBufferPitch()/4
    StopDrawing()
    
    For u=0 To gro
        For i=0 To trans(u)
            
            zx=zx(i,u)
            zy=zy(i,u)
            rx=511+xxx0-xxx+zx
            RY=383+yyy0-yyy+zy
            
            
            zx2=zx2(i,u)
            zy2=zy2(i,u)
            rx2=511+xxx0-xxx+zx2
            ry2=383+yyy0-yyy+zy2
            
            ; J'ai supprimé la fonction RGB() mais après quelques tests il semble que
            ; a = RGB(R,V,B) soit aussi rapide que a = R + V << 8 + B << 16
            ; mais je laisse quand même la modif , histoire de donner d'autres pistes à explorer :)
            
            adresse = adr + (Pitch * (yyy0+u)) << 2
            PokeL(adresse + (xxx0 + i) << 2, (b(rx,RY)+b(rx2,ry2)*3) >>2 + (v(rx,RY)+v(rx2,ry2)*3) >>2 <<8 + (r(rx,RY)+r(rx2,ry2)*3)>>2 <<16)
            rx-zx<<1
            rx2-zx2<<1
            PokeL(adresse + (xxx0 - i) << 2, (b(rx,RY)+b(rx2,ry2)*3) >>2 + (v(rx,RY)+v(rx2,ry2)*3) >>2 <<8 + (r(rx,RY)+r(rx2,ry2)*3)>>2 <<16)
            RY-zy<<1
            ry2-zy2<<1
            adresse = adr + (Pitch * (yyy0-u))<<2
            PokeL(adresse + (xxx0 - i) << 2, (b(rx,RY)+b(rx2,ry2)*3) >>2 + (v(rx,RY)+v(rx2,ry2)*3) >>2 <<8 + (r(rx,RY)+r(rx2,ry2)*3)>>2 <<16)
             rx+zx<<1
            rx2+zx2<<1
            PokeL(adresse + (xxx0 + i) << 2, (b(rx,RY)+b(rx2,ry2)*3) >>2 + (v(rx,RY)+v(rx2,ry2)*3) >>2 <<8 + (r(rx,RY)+r(rx2,ry2)*3)>>2 <<16)
             
        Next
    Next
  
    ExamineKeyboard()
    
Until KeyboardPushed(#PB_Key_Escape)
End 

Publié : dim. 10/juil./2005 15:26
par kelly
waouw, ca le fait aussi :wink:
ca a l'air plus rapide.

Par contre, pour tous ceux qui ont un plantage avec un code qu'ils ont eux meme modifié, cela viens de ce qu'un pixel ne peux pas etre mis hors zone de l'ecran (seulement a gauche et en haut)

Egalement, si vous changez la valeur "GRO", vous aurez un plantage assez rapide si gro deviens relaticement superieur a 130 car ma loupe cherche a savoir quel pixel coller mais elle cherche en dehors de la bank ! voila pourquoi ca plante 8)

bon, ma question tiens tjr : la version 3.93 de PB permet il cette fois de faire des plot en dehors de l'ecran sans que ca plante ????

Publié : dim. 10/juil./2005 19:02
par comtois
kelly a écrit :bon, ma question tiens tjr : la version 3.93 de PB permet il cette fois de faire des plot en dehors de l'ecran sans que ca plante ????
Non c'est à toi de contrôler les débordements . Par contre je crois que les commandes Box() et circle() peuvent être affichées en dehors de l'écran sans plantage .pour tester ,tu peux remplacer Plot() par Box(x,y,1,1).
mais ça sera lent , le mieux c'est de vérifier la validité de la position avant de faire un plot .