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

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...

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

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...

Merci beaucoup