Vectorisation

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Vectorisation

Message par Thyphoon »

Bon je sais voilà encore le Thyphoon avec ses questions tordu.

j'ai une map sous forme de tableau
Global Dim map(512,512)
lorsque map(x,y)=1 c'est qu'il y a un mur.

Je voudrais tracer la carte en vectoriel pour afficher le plan et pouvoir zoomer dessus.
Actuellement ça marche tres bien sauf que le rendu est moyen
Dison que pour chaque case de la map je teste a (X+1),(y+1),(X+1&Y+1)
et ensuite je trace une ligne entre les cases ayant un mur. mais ça donne un effet d'escalier. Je voulais savoir si il existait une methode pour lisser ça ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Image
voici une image a utilisé et le code que j'ai pondu :
Clic droit maintenu pour se deplacer
+ et - pour changer le zoom

Code : Tout sélectionner

Global Dim Map.b(512,512)
Global ME_WinX.l,ME_WinY.l,ME_WinWidth.l,ME_WinHeight.l
ME_WinX=320
ME_WinY=200
ME_WinWidth=256
ME_WinHeight=256

;-Main
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0 Or InitSound()=0
  MessageRequester("Error","DirectX 7+ is needed.",0) 
EndIf 

Filtre$ = "Image (*.png)|*.png"
Filtre  = 0    ; utiliser  par défaut le premier des trois filtres possibles
Fichier$=OpenFileRequester("choisir une image", FichierParDefaut$, Filtre$, FiltrePosition)


OpenScreen(800, 600, 32, "test") 

 
UsePNGImageDecoder() 
LoadImage(0,Fichier$)
iw=ImageWidth(0)
ih=ImageHeight(0)
If iw<=512:mw=iw:EndIf
If ih<=512:mh=ih:EndIf
If iw>512:mw=512:EndIf
If ih>512:mh=512:EndIf
StartDrawing(ImageOutput(0))
  For zx=0 To mw
    For zy=0 To mh
      col=Point(zx,zy)
      If col>RGB(128,128,128)
       Map(zx,zy)=1
      EndIf
    Next
  Next
StopDrawing()

FreeImage(0)




Global _VectoMapZoom=16
Global _VectoMapX.f=64
Global _VectoMapY.f=64

Procedure TestMap(x.l,y.l)
  If x>=0 And x<=512 And y>=0 And y<=512
    ProcedureReturn Map(x,y)
  Else 
    ProcedureReturn 0
  EndIf
EndProcedure

Repeat
  ExamineMouse() 
  ExamineKeyboard() 
  
  ;Depalcement
  If MouseButton(#PB_MouseButton_Left)
    _VectoMapX=_VectoMapX-MouseDeltaX()/(32/_VectoMapZoom)
    _VectoMapY=_VectoMapY-MouseDeltaY()/(32/_VectoMapZoom)
    If _VectoMapX<0:_VectoMapX=0:EndIf
    If _VectoMapX>512:_VectoMapX=512:EndIf
    If _VectoMapY<0:_VectoMapY=0:EndIf
    If _VectoMapY>512:_VectoMapY=512:EndIf
  EndIf
    
  ;Chament d'echelle 
  If ElapsedMilliseconds()>waitkey And _VectoMapZoom<32 And KeyboardPushed(#PB_Key_Add)
    _VectoMapZoom+1
    waitkey=ElapsedMilliseconds()+400
  EndIf
    
  ;Changement d'echelle
  If ElapsedMilliseconds()>waitkey And _VectoMapZoom>0 And KeyboardPushed(#PB_Key_Subtract) And ElapsedMilliseconds()>waitkey
    _VectoMapZoom-1
    waitkey=ElapsedMilliseconds()+400
  EndIf
   
  ClearScreen(0)
  
  StartDrawing(ScreenOutput())
  
    DrawingMode(#PB_2DDrawing_Outlined )

    Box(ME_WinX,ME_WinY,ME_WinWidth,ME_WinHeight,RGB(0,255,0))

    Def.f=32/_VectoMapZoom
    NbTile.w=ME_WinWidth/Def
    Cx=Round(_VectoMapX,0)-Int(NbTile/2)
    Cy=Round(_VectoMapY,0)-Int(NbTile/2)


    For zx=0 To NbTile
      For zy=0 To  NbTile
        Blocx=Cx+zx
        Blocy=Cy+zy
      
     
        Ts=TestMap(Blocx,Blocy); test de la case
        Td=TestMap(Blocx+1,Blocy) ;test de la case a sa droite
        Tb=TestMap(Blocx,Blocy+1) ;test de la case en bas
        Tbd=testMap(Blocx+1,Blocy+1) ;test de la case en bas a droite

        bx=ME_WinX+zx*Def;Calcul des coordonées du point
        by=ME_WinY+zy*Def;calcul des corddonées du point
       
        ;si j'ai un mur sur ma case ainsi qu'a sa droite
        If Ts=1 And Td=1
          LineXY(bx,by,bx+Def,by,RGB(0,0,255))
        EndIf
      
        ;Si j'ai un mur sur ma case ainsi qu'en dessou
        If Ts=1 And Tb=1
          LineXY(bx,by,bx,by+Def,RGB(0,0,255))
        EndIf
        
        ;Si j'ai un mur sur ma case ainsi qu'en diagonal
        If Ts=1 And Tbd=1 And Tb=0 And Td=0
          LineXY(bx,by,bx+Def,by+Def,RGB(0,0,255))
        EndIf
      Next
    Next
 
 Line(MouseX(),MouseY(),16,0,RGB(255,255,255))
 Line(MouseX(),MouseY(),0,16,RGB(255,255,255))
 StopDrawing()
 
     FlipBuffers(0) 
Until KeyboardPushed(#PB_Key_Escape) 
Bref ce n'est pas tres jolie et c'est assez groumant en puissance.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

boah ! ça tourne bien , je vois pas de ralentissement...

pat
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Patrick88 a écrit :boah ! ça tourne bien , je vois pas de ralentissement...

pat
Mon problème n'est pas trop là.C'est un peu lourd mais ça reste fluide et utilisable. Mon problème est plus sur la qualité du rendu ou Ou j'aurais aimé reussir a lisser et a avoir moins de cet effet d'escalier... :P
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message par minirop »

je pense qu'il faut passer par un algo style courbe de bézier qui trace une courbe passant par tous les points
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Un simple truc du style couleur pixel (x,y) = [couleur (x, y-1)+couleur (x, y+1)] / 2 ou plus élaboré doit pemettre de reduire les effets d'ecalier
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

minirop a écrit : je pense qu'il faut passer par un algo style courbe de bézier qui trace une courbe passant par tous les points
Oui je pense que ça doit être la solution...Faut que je regarde ça de plus prêt
Frenchy Pilou a écrit :Un simple truc du style couleur pixel (x,y) = [couleur (x, y-1)+couleur (x, y+1)] / 2 ou plus élaboré doit pemettre de reduire les effets d'ecalier
oui ça ça marche pour du Bitmap mais là je suis en vectoriel :P
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Vectoriel ou pas le résultat est sur l'écran, et c'est du pixel .
C'est donc bien le résultat "physique" que l'on peut modifier :)

Maintenant que le résultat soit améliorable dans le traçage vectoriel lui-même est fort possible aussi :)

Il reste à voir celui qui est le plus rapide
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Frenchy Pilou a écrit :Vectoriel ou pas le résultat est sur l'écran, et c'est du pixel .
C'est donc bien le résultat "physique" que l'on peut modifier :)

Maintenant que le résultat soit améliorable dans le traçage vectoriel lui-même est fort possible aussi :)

Il reste à voir celui qui est le plus rapide
A oui je je comprends mieux ce que tu veux dire. Tu as raison mais c'est vrai que c'est surtout au niveau du vectoriel que j'ai besoin... mais tu n'a pas tord et tu ma même donné une idée... :P Merci beaucoup
Répondre