une tres belle loupe

Partagez votre expérience de PureBasic avec les autres utilisateurs.
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

une tres belle loupe

Message 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:
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message par kelly »

vous en pensez koi au fait ???? :?: :?: :?: :?: :?:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Message par Torp »

Sympa, ça le fait bien! faut juste penser à mettre une image en fond. Chez moi ca plante pas.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

idem que Dri, j'ai pourtant mis une image de fond mais j'ai juste un cercle blanc
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 »

J'ai testé sur mon autre PC où les sprite3D ont tendance à tres bien marcher mais toujours ce cercle blanc...

Dri
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message 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 ???
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message 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 ??
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Avec les modifs de comtois ca fonctionne ^^
Sympa mais très lent...

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

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message 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 ????
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 .
Répondre