J'ai loupé Windows

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

J'ai loupé Windows

Message par Le Soldat Inconnu »

Une petite loupe pour windows

Flèche haut et bas pour agrandir la loupe
Flèche gauche et droite pour changer le zoom
F1 pour voir le FPS

il s'agit d'un dérivé de ce code :
http://purebasic.hmt-forum.com/viewtopic.php?t=1596&
Je l'ai optimiser (FPS * 2 par raport à l'ancien code) et j'ai changé l'effet pour avoir qlqchose qui ressemble plus à une loupe.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.91
; 
; Explication du programme :
; Fait un effet de loupe sur votre écran (comme ci une sphèse se déplacant dessus en déformant l'image)
; Utiliser les flèhes pour changer les paramètres
; F1 pour afficher les paramètres

#Pi.f = 3.14159265

; Calcul préliminaire
Global Zoom.f
#DefinitionConversion = 2000
Dim Conversion.f(#DefinitionConversion)

Procedure CalculConversion()
  For n = 0 To #DefinitionConversion
    Conversion(n) = 1 / (1 + Zoom * Cos(n / #DefinitionConversion * #Pi / 4))
  Next
EndProcedure

ProcedureDLL.l GetImageBits2(ImageID, HList) ; Transfert d'une image vers un tableau
  Protected bmi.BITMAPINFO, Hdc.l, Resultat, Mem, n, nn, bm.BITMAP, Temp1, Temp2, Temp3, Temp4, Temp5
  
  Resultat = 0
  
  GetObject_(ImageID, SizeOf(BITMAP), @bm.BITMAP)
  
  bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth = bm\bmWidth
  bmi\bmiHeader\biHeight = bm\bmHeight
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  Mem = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
  If Mem
    
    Hdc = CreateCompatibleDC_(GetDC_(ImageID))
    If Hdc
      GetDIBits_(Hdc, ImageID, 0, bm\bmHeight, Mem, @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
      ReleaseDC_(0, Hdc)
      Resultat = ImageID
    EndIf
    
    ; On convertit la liste dans le bon format
    ; On convertit la liste dans le bon format
    Temp1 = bm\bmHeight * 4
    Temp2 = bm\bmWidth * 4
    Temp3 = bm\bmHeight - 1
    For n = 0 To bm\bmHeight - 1
      For nn = 0 To bm\bmWidth - 1
        Temp4 = HList + n * 4 + nn * Temp1
        Temp5 = Mem + nn * 4 + (Temp3 - n) * Temp2
        PokeB(Temp4 + 2, PeekB(Temp5))
        PokeB(Temp4 + 1, PeekB(Temp5 + 1))
        PokeB(Temp4, PeekB(Temp5 + 2))
      Next
    Next
    
    FreeMemory(Mem)
  EndIf
  
  ProcedureReturn Resultat
EndProcedure


; Copie d'écran
Largeur_Ecran = GetSystemMetrics_(#SM_CXSCREEN)
Hauteur_Ecran = GetSystemMetrics_(#SM_CYSCREEN)

DC = GetDC_(0)
CreateImage(0, Largeur_Ecran, Hauteur_Ecran)
Dessin = StartDrawing(ImageOutput())
  BitBlt_(Dessin, 0, 0, Largeur_Ecran, Hauteur_Ecran, DC, 0, 0, #SRCPAINT)
StopDrawing()
ReleaseDC_(0, DC)

; On copie l'image dans un Tableau
Dim Image.l(Largeur_Ecran - 1, Hauteur_Ecran - 1)
GetImageBits2(UseImage(0), @Image())

; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
  End
EndIf

If OpenScreen(Largeur_Ecran, Hauteur_Ecran, 32, "Sphère") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

; Création du sprite représentant l'écran
CreateSprite(1, Largeur_Ecran, Hauteur_Ecran)
StartDrawing(SpriteOutput(1))
  DrawImage(UseImage(0), 0, 0)
StopDrawing()




; Initialisation des variables
#ZoomMax = 4
Zoom = 1
CalculConversion()
#RayonMax = 400
Rayon = 100

Repeat
  ; On lit les évènements clavier et souris
  ExamineMouse()
  ExamineKeyboard()
  
  ; Position de la souris
  x = MouseX()
  y = MouseY()
  
  ; Agrandir ou réduire la loupe
  If KeyboardReleased(#PB_Key_Up) And Rayon < #RayonMax
    Rayon + 20
  ElseIf KeyboardReleased(#PB_Key_Down) And Rayon > 0
    Rayon - 20
  EndIf
  
  ; Changer le zoom
  If KeyboardReleased(#PB_Key_Right) And Zoom < #ZoomMax
    Zoom + 0.25
    CalculConversion()
  ElseIf KeyboardReleased(#PB_Key_Left) And Zoom > 0
    Zoom - 0.25
    CalculConversion()
  EndIf
  
  ; On affiche l'image
  DisplaySprite(1, 0, 0)
  
  StartDrawing(ScreenOutput())
    ; Calcul du FPS
    If KeyboardPushed(#PB_Key_F1)
      Cpt + 1
      If Cpt >= FPS.f / 2
        FPS = Cpt * 1000 / (ElapsedMilliseconds() - Temps)
        Cpt = 0
        Temps = ElapsedMilliseconds()
      EndIf
      Locate(5, 5)
      DrawText("FPS = " + StrF(FPS, 1))
      Locate(5, 20)
      DrawText("Rayon = " + Str(Rayon))
      Locate(5, 35)
      DrawText("Zoom = " + StrF(Zoom + 1, 2))
    EndIf
    
    ; On édite l'image
    Memoire = DrawingBuffer()
    For n = -Rayon To Rayon
      x2 = x + n
      If x2 > 0 And x2 < Largeur_Ecran - 1 ; Si on est sur l'image en x
        For nn = -Rayon To Rayon
          y2 = y + nn
          If y2 > 0 And y2 < Hauteur_Ecran - 1 ; Si on est sur l'image en y
            Longueur.f = Sqr(n * n + nn * nn) ; On calcul la distance d'un point de la sphère à partir du centre
            If Rayon - Longueur <= 1 And Rayon - Longueur >= -1 ; On dessine le coutour de la loupe
              Plot(x2, y2, 0)
              
            ElseIf Longueur <= Rayon ; Si le pixel est situé dans le rayon du cercle
              Longueur2.f = Conversion(Int((Longueur / Rayon) * #DefinitionConversion)) ; on calcul la distance du point de l'image correspondant à celui de la sphère
              
              ; Avec lissage
              PosX.f = x + n * Longueur2
              PosY.f = y + nn * Longueur2
              PosX_Int.l = PosX
              PosY_Int.l = PosY
              PosX_Ecart.f = Abs(PosX - PosX_Int)
              PosY_Ecart.f = Abs(PosY - PosY_Int)
              PosX_EcartInv.f = 1 - PosX_Ecart
              PosY_EcartInv.f = 1 - PosY_Ecart
              If PosX >= PosX_Int
                If PosY >= PosY_Int ; bas, droite
                  Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int + 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
                  Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int + 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
                  Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int + 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
                Else ; haut, droite
                  Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int + 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
                  Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int + 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
                  Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int + 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int + 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
                EndIf
              Else
                If PosY >= PosY_Int ; bas, gauche
                  Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int - 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
                  Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int - 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
                  Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int + 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int - 1, PosY_Int + 1)) * PosX_Ecart * PosY_Ecart
                Else ; haut, gauche
                  Rouge = Red(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Red(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Red(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Red(Image(PosX_Int - 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
                  Vert = Green(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Green(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Green(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Green(Image(PosX_Int - 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
                  Bleu = Blue(Image(PosX_Int, PosY_Int)) * PosX_EcartInv * PosY_EcartInv + Blue(Image(PosX_Int - 1, PosY_Int)) * PosX_Ecart * PosY_EcartInv + Blue(Image(PosX_Int, PosY_Int - 1)) * PosX_EcartInv * PosY_Ecart + Blue(Image(PosX_Int - 1, PosY_Int - 1)) * PosX_Ecart * PosY_Ecart
                EndIf
              EndIf
              Couleur = RGB(Rouge, Vert, Bleu)
              
              ; Sans lissage
              ; Couleur.l = Image(Int(x + n * Longueur2 + 0.5), Int(y + nn * Longueur2 + 0.5))
              
              ; On affiche le pixel
              Plot(x2, y2, Couleur)
              
            EndIf
          EndIf
        Next
      EndIf
    Next
    
  StopDrawing()
  
  FlipBuffers()
  
  If IsScreenActive() = 0
    End
  EndIf
  
Until KeyboardPushed(#PB_Key_Escape)
ici, il est en version avec lissage, pour les petites config, suffit de passer avec la version sans lissage en jouant sur les commentaires
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)]
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

super , j'adore .
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Moi de même :)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

L'effet est top!
Malheureusement pour moi ca rame comme pas possible (j'ai que 500Mhz snif!)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Excellent! :D
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai cherché à optimiser mais rien

j'ai juste ajouté le pasage en auto entre lissage et sans lissage mais le gain est pas énorme

sinon, en regardant ce qui me prenait du temps, j'ai trouvé que juste les 2 boucle for imbriqué suffise pour faire chuter le FPS quand le rayon augmente 8O

Code : Tout sélectionner

For n = -Rayon To Rayon
        For nn = -Rayon To Rayon
          y2 = y + nn : x2 = x + n
          If x2 > 0 And x2 < Largeur_Ecran And y2 > 0 And y2 < Hauteur_Ecran ; Si on est sur l'image
Et la pour optimiser :?


bon voici le code qui passe au mode sans lissage en auto si le fps est trop bas

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.91
;
; Explication du programme :
; Fait un effet de loupe sur votre écran (comme ci une sphèse se déplacant dessus en déformant l'image)
; Utiliser les flèhes pour changer les paramètres
; F1 pour afficher les paramètres

#Pi.f = 3.14159265

; Calcul préliminaire
Global Zoom.f, x.l, y.l, x2.l, y2.l, Rayon.l

ProcedureDLL.l GetImageBits2(ImageID, HList) ; Transfert d'une image vers un tableau
  Protected bmi.BITMAPINFO, Hdc.l, Resultat, Mem, n, nn, bm.BITMAP, Temp1, Temp2, Temp3, Temp4, Temp5
  
  Resultat = 0
  
  GetObject_(ImageID, SizeOf(BITMAP), @bm.BITMAP)
  
  bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth = bm\bmWidth
  bmi\bmiHeader\biHeight = bm\bmHeight
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  Mem = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
  If Mem
    
    Hdc = CreateCompatibleDC_(GetDC_(ImageID))
    If Hdc
      GetDIBits_(Hdc, ImageID, 0, bm\bmHeight, Mem, @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
      ReleaseDC_(0, Hdc)
      Resultat = ImageID
    EndIf
    
    ; On convertit la liste dans le bon format
    Temp1 = bm\bmHeight * 4
    Temp2 = bm\bmWidth * 4
    Temp3 = bm\bmHeight - 1
    For n = 0 To bm\bmHeight - 1
      For nn = 0 To bm\bmWidth - 1
        Temp4 = HList + n * 4 + nn * Temp1
        Temp5 = Mem + nn * 4 + (Temp3 - n) * Temp2
        PokeB(Temp4 + 2, PeekB(Temp5))
        PokeB(Temp4 + 1, PeekB(Temp5 + 1))
        PokeB(Temp4, PeekB(Temp5 + 2))
      Next
    Next
    
    FreeMemory(Mem)
  EndIf
  
  ProcedureReturn Resultat
EndProcedure


; Copie d'écran
Largeur_Ecran = GetSystemMetrics_(#SM_CXSCREEN)
Hauteur_Ecran = GetSystemMetrics_(#SM_CYSCREEN)

DC = GetDC_(0)
CreateImage(0, Largeur_Ecran, Hauteur_Ecran)
Dessin = StartDrawing(ImageOutput())
  BitBlt_(Dessin, 0, 0, Largeur_Ecran, Hauteur_Ecran, DC, 0, 0, #SRCPAINT)
StopDrawing()
ReleaseDC_(0, DC)

; On copie l'image dans un Tableau
Dim Image.l(Largeur_Ecran - 1, Hauteur_Ecran - 1)
GetImageBits2(UseImage(0), @Image())

Dim ImageR.l(Largeur_Ecran - 1, Hauteur_Ecran - 1)
Dim ImageG.l(Largeur_Ecran - 1, Hauteur_Ecran - 1)
Dim ImageB.l(Largeur_Ecran - 1, Hauteur_Ecran - 1)

For n = 0 To Largeur_Ecran - 1
  For nn = 0 To Hauteur_Ecran - 1
    ImageR(n, nn) = Red(Image(n, nn))
    ImageG(n, nn) = Green(Image(n, nn))
    ImageB(n, nn) = Blue(Image(n, nn))
  Next
Next


; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
  End
EndIf

If OpenScreen(Largeur_Ecran, Hauteur_Ecran, 32, "Sphère") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

; Création du sprite représentant l'écran
CreateSprite(1, Largeur_Ecran, Hauteur_Ecran)
StartDrawing(SpriteOutput(1))
  DrawImage(UseImage(0), 0, 0)
StopDrawing()

MouseLocate(Largeur_Ecran / 2, Hauteur_Ecran / 2)

; Initialisation des variables
Largeur_Ecran - 1
Hauteur_Ecran - 1
#ZoomMax = 8
Zoom = 2
#RayonMax = 400
Rayon = 100
#LimiteLissage = 10 ; Si le FPS descend en dessous de cette valeur, on passe en mode sans lissage
Cpt = 0
FPS.f = #LimiteLissage
Temps = ElapsedMilliseconds()

Repeat
  ; On lit les évènements clavier et souris
  ExamineMouse()
  ExamineKeyboard()
  
  ; Position de la souris
  x = MouseX()
  y = MouseY()
  
  ; Agrandir ou réduire la loupe
  If KeyboardReleased(#PB_Key_Up) And Rayon < #RayonMax
    Rayon + 20
  ElseIf KeyboardReleased(#PB_Key_Down) And Rayon > 0
    Rayon - 20
    If Lissage > Rayon ; On réactive le lissage si rayon permet un FPS > #LimiteLissage
      Lissage = 0
    EndIf
  EndIf
  
  ; Changer le zoom
  If KeyboardReleased(#PB_Key_Right) And Zoom < #ZoomMax
    Zoom * 2
  ElseIf KeyboardReleased(#PB_Key_Left) And Zoom > 0.25
    Zoom / 2
  EndIf
  
  ; On affiche l'image
  DisplaySprite(1, 0, 0)
  
  StartDrawing(ScreenOutput())
    ; Calcul du FPS
    
    Cpt + 1
    If Cpt >= FPS.f
      FPS = Cpt * 1000 / (ElapsedMilliseconds() - Temps)
      Cpt = 0
      Temps = ElapsedMilliseconds()
    EndIf
    If KeyboardReleased(#PB_Key_F1)
      Deboguage = Deboguage ! 1
    EndIf
    If Deboguage
      Locate(5, 5)
      DrawText("FPS = " + StrF(FPS, 1))
      Locate(5, 20)
      DrawText("Rayon = " + Str(Rayon))
      Locate(5, 35)
      DrawText("Zoom = " + StrF(Zoom + 1, 2))
    EndIf
    
    ; On édite l'image
    For n = -Rayon To Rayon
        For nn = -Rayon To Rayon
          y2 = y + nn : x2 = x + n
          If x2 > 0 And x2 < Largeur_Ecran And y2 > 0 And y2 < Hauteur_Ecran ; Si on est sur l'image
            Longueur.f = Sqr(n * n + nn * nn) ; On calcul la distance d'un point de la sphère à partir du centre
            If Abs(Rayon - Longueur) <= 1 ; On dessine le coutour de la loupe
              Plot(x2, y2, 0)
              
            ElseIf Longueur <= Rayon ; Si le pixel est situé dans le rayon du cercle
              ; Longueur2.f = Conversion(Int(Longueur * #DefinitionConversion / Rayon)) ; on calcul la distance du point de l'image correspondant à celui de la sphère
              Longueur2.f = 1 / (1 + Zoom * Cos(Longueur / Rayon * #Pi / 4))
              
              If FPS >= #LimiteLissage And Lissage = 0
                ; Si le FPS est élevé, on travaille avec du lissage
                PosX.f = x + n * Longueur2
                PosY.f = y + nn * Longueur2
                PosX_Int.l = PosX
                PosY_Int.l = PosY
                PosX_Ecart.f = Abs(PosX - PosX_Int)
                PosY_Ecart.f = Abs(PosY - PosY_Int)
                PosX_EcartInv.f = 1 - PosX_Ecart
                PosY_EcartInv.f = 1 - PosY_Ecart
                If PosX >= PosX_Int
                  If PosY >= PosY_Int ; bas, droite
                    Rouge = ImageR(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageR(PosX_Int + 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageR(PosX_Int, PosY_Int + 1) * PosX_EcartInv * PosY_Ecart + ImageR(PosX_Int + 1, PosY_Int + 1) * PosX_Ecart * PosY_Ecart
                    Vert = ImageG(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageG(PosX_Int + 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageG(PosX_Int, PosY_Int + 1) * PosX_EcartInv * PosY_Ecart + ImageG(PosX_Int + 1, PosY_Int + 1) * PosX_Ecart * PosY_Ecart
                    Bleu = ImageB(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageB(PosX_Int + 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageB(PosX_Int, PosY_Int + 1) * PosX_EcartInv * PosY_Ecart + ImageB(PosX_Int + 1, PosY_Int + 1) * PosX_Ecart * PosY_Ecart
                  Else ; haut, droite
                    Rouge = ImageR(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageR(PosX_Int + 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageR(PosX_Int, PosY_Int - 1) * PosX_EcartInv * PosY_Ecart + ImageR(PosX_Int + 1, PosY_Int - 1) * PosX_Ecart * PosY_Ecart
                    Vert = ImageG(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageG(PosX_Int + 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageG(PosX_Int, PosY_Int - 1) * PosX_EcartInv * PosY_Ecart + ImageG(PosX_Int + 1, PosY_Int - 1) * PosX_Ecart * PosY_Ecart
                    Bleu = ImageB(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageB(PosX_Int + 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageB(PosX_Int, PosY_Int - 1) * PosX_EcartInv * PosY_Ecart + ImageB(PosX_Int + 1, PosY_Int - 1) * PosX_Ecart * PosY_Ecart
                  EndIf
                Else
                  If PosY >= PosY_Int ; bas, gauche
                    Rouge = ImageR(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageR(PosX_Int - 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageR(PosX_Int, PosY_Int + 1) * PosX_EcartInv * PosY_Ecart + ImageR(PosX_Int - 1, PosY_Int + 1) * PosX_Ecart * PosY_Ecart
                    Vert = ImageG(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageG(PosX_Int - 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageG(PosX_Int, PosY_Int + 1) * PosX_EcartInv * PosY_Ecart + ImageG(PosX_Int - 1, PosY_Int + 1) * PosX_Ecart * PosY_Ecart
                    Bleu = ImageB(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageB(PosX_Int - 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageB(PosX_Int, PosY_Int + 1) * PosX_EcartInv * PosY_Ecart + ImageB(PosX_Int - 1, PosY_Int + 1) * PosX_Ecart * PosY_Ecart
                  Else ; haut, gauche
                    Rouge = ImageR(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageR(PosX_Int - 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageR(PosX_Int, PosY_Int - 1) * PosX_EcartInv * PosY_Ecart + ImageR(PosX_Int - 1, PosY_Int - 1) * PosX_Ecart * PosY_Ecart
                    Vert = ImageG(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageG(PosX_Int - 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageG(PosX_Int, PosY_Int - 1) * PosX_EcartInv * PosY_Ecart + ImageG(PosX_Int - 1, PosY_Int - 1) * PosX_Ecart * PosY_Ecart
                    Bleu = ImageB(PosX_Int, PosY_Int) * PosX_EcartInv * PosY_EcartInv + ImageB(PosX_Int - 1, PosY_Int) * PosX_Ecart * PosY_EcartInv + ImageB(PosX_Int, PosY_Int - 1) * PosX_EcartInv * PosY_Ecart + ImageB(PosX_Int - 1, PosY_Int - 1) * PosX_Ecart * PosY_Ecart
                  EndIf
                EndIf
                Couleur = RGB(Rouge, Vert, Bleu)
                
              Else
                ; Si le FPS passe en dessous de 10, on utilise la version sans lissage
                Couleur.l = Image(Int(x + n * Longueur2), Int(y + nn * Longueur2))
                Lissage = Rayon ; On supprime le lissage à partir de ce rayon de loupe, dès que le rayon sera plus petit, on réactivera le lissage
              EndIf
              
              ; On affiche le pixel
              Plot(x2, y2, Couleur)
              
            EndIf
          EndIf
        Next nn
    Next n
    
  StopDrawing()
  
  FlipBuffers()
  
  If IsScreenActive() = 0
    End
  EndIf
  
Until KeyboardPushed(#PB_Key_Escape)
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äc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

LSI a écrit :j'ai juste ajouté le pasage en auto entre lissage et sans lissage mais le gain est pas énorme
Effectivement ca ne joue pas vraiment.
Je support potablement un rayon de 60 seulement aussi bien en lissé que non, correspondant à un FPS de 12...
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Ah, les calculs de transformation d'image sont gourmand en ressource.

Après, pour optimiser, faut passer par l'openGl ou le DirectX, je pense.

dans le genre défénir une demi sphère sur laquelle on applique une peau.

mais la, ça demande de se lancer dans la 3D et pour le moment, j'en ai pas envie
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äc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

No problemo :)
Dans le futur, si tu penses avoir optimisé ton code, je pense à mon tour etre un bon indicateur pour toi… :wink:
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message par Golfy »

Excellent !

Régis (LSI) : pourquoi ne publies-tu pas tes programmes sur anshare.org ? c'est gratuit et facile !

Je me suis également permis de signaler ton outils "enregistrer sous" à Clubic :)
Edit 16/02/2005 11:55 voici leur commentaire :)
http://www.clubic.com/telecharger-fiche ... iteur.html
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

C'est excellent !
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

> Golfy : Je suis déjà sous anshare :)

Par contre Clubic, j'avais jamais réussi. Tu as fait comment ?
Déjà, je retrouve même pas le lien pour proposer un soft :lol:
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)]
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message par Golfy »

euh... en fait j'ai contacté qqu'un au hasard dans la rédaction :|
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

OK merci :D
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)]
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

On fait comment pour Clubic ? :)
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Répondre