Page 1 sur 1

Vectorisation

Publié : ven. 09/mars/2007 10:44
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 ?

Publié : ven. 09/mars/2007 11:23
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.

Publié : ven. 09/mars/2007 13:08
par Patrick88
boah ! ça tourne bien , je vois pas de ralentissement...

pat

Publié : ven. 09/mars/2007 13:18
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

Publié : lun. 12/mars/2007 2:32
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

Publié : lun. 12/mars/2007 3:12
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

Publié : lun. 12/mars/2007 8:13
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

Publié : lun. 12/mars/2007 10:12
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

Publié : lun. 12/mars/2007 10:53
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