Vectorisation
Vectorisation
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 ?
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 ?

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)
-
- Messages : 2194
- Inscription : jeu. 27/janv./2005 19:07
Oui je pense que ça doit être la solution...Faut que je regarde ça de plus prêtminirop 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 ça ça marche pour du Bitmap mais là je suis en vectorielFrenchy 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

-
- Messages : 2194
- Inscription : jeu. 27/janv./2005 19:07
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...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
