Create a map 2D with PB
Re: Create a map 2D with PB
You could also consider using the new OpenGLGadget.
Unfortunately I'm not familiar with OpenGL but I guess zooming might be easier compared to the CanvasGadget.
			
			
									
									Unfortunately I'm not familiar with OpenGL but I guess zooming might be easier compared to the CanvasGadget.
Windows (x64)
Raspberry Pi OS (Arm64)
						Raspberry Pi OS (Arm64)
- Kwai chang caine
- Always Here 
- Posts: 5502
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Create a map 2D with PB
Yes ..i can, i can....but i not dare !!!  
 
In fact, i have thinking to all this splendid and power library before create this thread...
But i say to me :
"KCC...when you are not able to ride a donkey...."

"It's not a real good idea to try a bull.... "
 "

"Even romantic"
			
			
									
									 
 In fact, i have thinking to all this splendid and power library before create this thread...
But i say to me :
"KCC...when you are not able to ride a donkey...."
"It's not a real good idea to try a bull....
 "
 ""Even romantic"

 The happiness is a road...
The happiness is a road...Not a destination
Re: Create a map 2D with PB
As you guessed, the second code generates the "Datadepartement.Dat" for the first code.Kwaï chang caïne wrote: So in my little head i say to me perhaps the second code create the "datadepartements.DAT" for the first ???
I have try and see all the departements selectionned is saved in the "datadepartements.DAT"
This second code fill the departement you select with the mouse and "extract" the shape of the departement.
Then it exports them in the datadepartements.Dat
You don't really need the second code except if you want to adapt the data for an other use. (or an other map... Romania, Russia, Germany, Europe... take your pick)
Maybe it may interest someone in the future, so i keep the second code here.
Yes i already answered to this... It's kind of a Dijkstra flooding. Not really a big deal.Kwaï chang caïne wrote: And justly, my second stupid question is how you select all the department for create this data ??http://wordoxhelper.free.fr/datadepartements.DAT
There are 2 methods to program bugless. 
But only the third works fine.
Win10, Pb x64 5.71 LTS
						But only the third works fine.
Win10, Pb x64 5.71 LTS
- Kwai chang caine
- Always Here 
- Posts: 5502
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Create a map 2D with PB
Justly, i begin to the france, but after i try to do some departements and their township...Fig wrote:You don't really need the second code except if you want to adapt the data for an other use. (or an other map... Romania, Russia, Germany, Europe... take your pick)
It's for that i ask to you that.. (You have reading in my mind)
 
 In fact little KCC not really have the word like ambition, it's too big
 ....
 ....The "Rhone-alpes" region is enough for the moment
 
 I have see some card on the web with only the border of regions and townships, but apparently numerous is not freeware

 The happiness is a road...
The happiness is a road...Not a destination
Re: Create a map 2D with PB
Ctrl + ,Ctrl - to Zoom In or Out
Ctrl + MouseWheel to Zoom in or out
Arrow keys to move Up ,Down, Left & Right
Have fun KCC
			
			
									
									Ctrl + MouseWheel to Zoom in or out
Arrow keys to move Up ,Down, Left & Right
Have fun KCC
Code: Select all
Procedure Mouse_Wheel(Delta)
  In.INPUT
  In\type        = #INPUT_MOUSE;
  In\mi\dwFlags  = #MOUSEEVENTF_WHEEL
  In\mi\mouseData = Delta * 120
  SendInput_(1,@In,SizeOf(INPUT))
EndProcedure
Procedure LeftClick()
  In.INPUT
  In\type        = #INPUT_MOUSE
  In\mi\dwFlags  = #MOUSEEVENTF_LEFTDOWN
  SendInput_(1,@In,SizeOf(INPUT))
  In\mi\dwFlags  = #MOUSEEVENTF_LEFTUP
  SendInput_(1,@In,SizeOf(INPUT))
EndProcedure
LoadImage(0,"g:\projects\for test\France Map2.bmp")
CreateImage(1,ImageWidth(0),ImageHeight(0))
If  FileSize(GetHomeDirectory()+"France Map2.bmp") > 0
     DeleteFile(GetHomeDirectory()+"France Map2.bmp")
EndIf
If OpenWindow(0, 0, 0, ImageWidth(0)+20,ImageHeight(0)+80,  "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_SizeGadget)
  ContainerGadget(4,10,10,ImageWidth(0),ImageHeight(0))
     WebGadget(0, 0, 0, ImageWidth(0), ImageHeight(0), "") 
  CloseGadgetList()
  HideGadget(4,1)
  CanvasGadget(1,10,10,ImageWidth(0),ImageHeight(0),#WS_CLIPSIBLINGS)
  StartDrawing(CanvasOutput(1))
      DrawImage(ImageID(0),0,0)
  StopDrawing()
  
  ButtonGadget(2,10,ImageHeight(0)+20,80,24,"Edit")
  ButtonGadget(3,100,ImageHeight(0)+20,80,24,"ZOOM In/Out")
  SetWindowColor(0,#Gray)
     
  AddKeyboardShortcut(0,#PB_Shortcut_Control|107,1)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|109,2)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|187,3)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|189,4)
   
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
          Quit = 1
          
          
    Case #PB_Event_SizeWindow
        ResizeGadget(0,#PB_Ignore, #PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-20)        
         
       
    Case #PB_Event_Menu
        Select EventMenu()
            Case 1,3
                If Plus = 0
                  GetWindowRect_(GadgetID(0),r.RECT)
                  SetCursorPos_((r\right-5),(r\bottom-5))
                  LeftClick ()
                  Plus + 1
                EndIf
                Mouse_Wheel(2)
                
            Case 2,4
                If Minus = 0
                  GetWindowRect_(GadgetID(0),r.RECT)
                  SetCursorPos_((r\right-5),(r\bottom-5))
                  LeftClick ()
                  Minus + 1
                EndIf
                Mouse_Wheel(-2)
        EndSelect
        
        Case #PB_Event_Gadget
          Select EventGadget()
           Case 1
                  Select EventType()
                       Case  #PB_EventType_MouseMove
                       x =  GetGadgetAttribute(1,#PB_Canvas_MouseX)
                       y =  GetGadgetAttribute(1,#PB_Canvas_MouseY)
                       
                  Case #PB_EventType_RightClick
                     Color = ColorRequester()
                      StartDrawing(CanvasOutput(1))                                 
                                 FillArea(x,y,-1,Color)                             
                      StopDrawing()
                      StartDrawing(ImageOutput(1))
                           DrawImage(GetGadgetAttribute(1,#PB_Canvas_Image ) ,0,0)
                      StopDrawing()
                      SaveImage(1,GetHomeDirectory()+"France Map2.bmp",#PB_ImagePlugin_BMP)
                     
        
                  EndSelect
            Case 2
                    HideGadget(4,1)
                    HideGadget(0,1)
                    HideGadget(1,0)
                    
            Case 3
                    HideGadget(4,0)
                    HideGadget(0,0)
                    HideGadget(1,1)
                    SetGadgetText(0, GetHomeDirectory()+"France Map2.bmp")
                    SetCursorPos_(WindowX(0)+100,WindowY(0)+100)
                    LeftClick()
          EndSelect
  EndSelect
Until Quit = 1
   
EndIf
Egypt my love
						Re: Create a map 2D with PB
Rhones Alpes is the following:
http://wordoxhelper.free.fr/datadeparte ... eAlpes.DAT
Concerning the town it's easy to do, I am sure you are capable to adapt my code to add the informations you need.
			
			
									
									http://wordoxhelper.free.fr/datadeparte ... eAlpes.DAT
Concerning the town it's easy to do, I am sure you are capable to adapt my code to add the informations you need.
There are 2 methods to program bugless. 
But only the third works fine.
Win10, Pb x64 5.71 LTS
						But only the third works fine.
Win10, Pb x64 5.71 LTS
- Kwai chang caine
- Always Here 
- Posts: 5502
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Create a map 2D with PB
hi KCC
move click left and whell mouse zoom
best regard
			
			
													move click left and whell mouse zoom
best regard
Code: Select all
Enumeration
  #Window
  #Image0  
  #Image1 
  #Scroll
  #canvas
EndEnumeration
LoadImage(#Image0, "France Map.bmp") 
CreateImage(#Image1,ImageWidth(#Image0),ImageHeight(#Image0))
CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize
OpenWindow(#Window,0, 0,ImageWidth(#Image0)+20,ImageHeight(#Image0)+20, "Zoom Canvas ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
SetWindowColor(#Window,#White) 
CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_DrawFocus|#PB_Canvas_Keyboard)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel     
bm=#False
Repeat
  Event= WaitWindowEvent()
     Select EventType()  
    Case #PB_EventType_MouseWheel  
      
      delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*10) ; delta*10
      CopyImage(#Image1,#Image0)      ; restore l'image originale                         
      ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)	
      StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),255)
      StopDrawing()
      
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
      
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1  
      
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm
      EndIf
      CopyImage(#Image1,#Image0)      ; Restore l'image originale  
      ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)	
      StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),255)
      StopDrawing() 
      
    Case #PB_EventType_LeftButtonUp
      bm=#False  
      
    Case #PB_EventType_RightButtonUp    
      bm=#False
  EndSelect  
  
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))
      win_w=WindowWidth(#Window)
      win_h=WindowHeight(#Window)
  EndSelect  
  
Until Event= #PB_Event_CloseWindow
End
					Last edited by kernadec on Wed Jun 25, 2014 6:34 pm, edited 1 time in total.
									
			
									
						- Kwai chang caine
- Always Here 
- Posts: 5502
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Create a map 2D with PB
Hello my friend KERNADEC  
Thanks to your code, but i have a grey window...with hourglass
Edit : I have commented the SetActiveGadget(#canvas) and that's works better
			
			
									
									
Thanks to your code, but i have a grey window...with hourglass

Edit : I have commented the SetActiveGadget(#canvas) and that's works better
 The happiness is a road...
The happiness is a road...Not a destination
- Kwai chang caine
- Always Here 
- Posts: 5502
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Create a map 2D with PB
Whaooouhh (2) !!!
That's works great KERNADEC without the SetActiveGadget
Thanks a lot
			
			
									
									That's works great KERNADEC without the SetActiveGadget
Thanks a lot

 The happiness is a road...
The happiness is a road...Not a destination
- Kwai chang caine
- Always Here 
- Posts: 5502
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Create a map 2D with PB
1/ I have try to modify the FIG code for selected on the fly each department.
http://www.purebasic.fr/english/viewtop ... 48#p447048
That works...finally nearly because i don't understand why, fillarea clear sometime the red border already drawing
 because i don't understand why, fillarea clear sometime the red border already drawing  
Even if i made more heavy, the red frontier sometime is when even deleted
2/ If someone know furthermore how all selected with a button...i marry him 
 
Code modified
			
			
									
									http://www.purebasic.fr/english/viewtop ... 48#p447048
That works...finally nearly
 because i don't understand why, fillarea clear sometime the red border already drawing
 because i don't understand why, fillarea clear sometime the red border already drawing  
Even if i made more heavy, the red frontier sometime is when even deleted

2/ If someone know furthermore how all selected with a button...i marry him
 
 Code: Select all
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitNetwork()=0:MessageRequester("Error","Error DirectX",0):EndIf
If OpenWindow(0,0,0,870,850, "p ", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
 ButtonGadget(5, 700, 810, 70, 30, "All select")
 If OpenWindowedScreen(WindowID(0),0,0,870,801,0,0,0,#PB_Screen_NoSynchronization)=0
  MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
  End
 EndIf
EndIf
CreateSprite(0,20,20)
StartDrawing(SpriteOutput(0))
Box(0,0,20,20,#Red)
Box(1,1,20,20,#Black)
StopDrawing()
LoadSprite(1,"France Map.bmp")
Structure xy
 x.i
 y.i
EndStructure
Structure dep
 numero.i
 barycentreX.i
 barycentreY.i
 xmin.i
 ymin.i
 Map vecteur.xy()
EndStructure
Global NewList departement.dep()
Procedure Find_limit(x.i,y.i,numero_departement.i)
 AddElement(departement())
 Dim carte.i(870,801)
 NewList fringe.xy()
 AddElement(fringe())
 fringe()\x=x
 fringe()\y=y
 carte(x,y)=1
 couleur.i=Point(x,y)
 
 Repeat
 
  For i=-1 To 1
  
   For j=-1 To 1
   
    If i=0 And j=0:Continue:EndIf
    
    xx=fringe()\x+i:yy=fringe()\y+j
    
    If carte(xx,yy):Continue:EndIf
    
    carte(xx,yy)=1
    
    If xx < SpriteWidth(1) And yy < SpriteHeight(1) And xx > 0 And yy > 0
     If Point(xx,yy)<>couleur
      AddMapElement(departement()\vecteur(),Str(xx)+"/"+Str(yy))
      departement()\vecteur()\x=xx:departement()\vecteur()\y=yy
      Continue
     EndIf
    EndIf
    
    AddElement(fringe())
    fringe()\x=xx:fringe()\y=yy
    PreviousElement(fringe())
    
   Next j
   
  Next i
  
  DeleteElement(fringe())
  
 Until FirstElement(fringe())=0
 
 ;fringe red display
 xb=0:yb=0:a=0:xmin=870:ymin=801
 
 ForEach departement()\vecteur()
 
  a+1
  
  If departement()\vecteur()\x<xmin:xmin=departement()\vecteur()\x:EndIf
  If departement()\vecteur()\y<ymin:ymin=departement()\vecteur()\y:EndIf
  
  Plot(departement()\vecteur()\x - 1,departement()\vecteur()\y - 1,#Red)
  Plot(departement()\vecteur()\x,departement()\vecteur()\y,#Red)
  Plot(departement()\vecteur()\x + 1,departement()\vecteur()\y + 1,#Red)
  
  xb=departement()\vecteur()\x+xb
  yb=departement()\vecteur()\y+yb
  
 Next
 
 ;Debug a
 departement()\xmin=xmin
 departement()\ymin=ymin
 ;barycentre
 xb=xb/MapSize(departement()\vecteur())
 yb=yb/MapSize(departement()\vecteur())-2
 FillArea(xb,yb,-1,#Blue)
 departement()\barycentreX=xb:departement()\barycentreY=yb
 departement()\numero=numero_departement
 
EndProcedure
StartDrawing(SpriteOutput(1))
CouleurFond = Point(20,20)
StopDrawing()
Repeat
 Event = WindowEvent()
 FlipBuffers()
 ClearScreen(#White)
 ExamineKeyboard()
  
 y=WindowMouseY(0)
 x=WindowMouseX(0)
 ;display map
 DisplaySprite(1,0,0)
 StartDrawing(SpriteOutput(1))
 
 If x < SpriteWidth(1) And y < SpriteHeight(1) And x > 0 And y > 0
 
  CouleurPointeur = Point(x,y)
   
  If x > 1 And y > 1 And CouleurPointeur <> #Red And CouleurPointeur <> #Blue And CouleurPointeur <> #White And CouleurPointeur <> CouleurFond
   find_limit(x,y,numero_departement)
  EndIf
 
 EndIf
 
 StopDrawing()
 ;sauvegarde
 If KeyboardReleased(#PB_Key_S) And CreateFile(0,"datadepartements.DAT")
 
  ForEach departement()
  
   WriteStringN(0,"Numero departement: "+Str(departement()\numero))
   WriteStringN(0,"Barycentre X: "+Str(departement()\barycentreX))
   WriteStringN(0,"Barycentre Y: "+Str(departement()\barycentreY))
   WriteStringN(0,"Pt haut gauche X: "+Str(departement()\xmin))
   WriteStringN(0,"Pt haut gauche Y: "+Str(departement()\ymin))
   WriteStringN(0,"NB vecteur: "+Str(MapSize(departement()\vecteur())))
   a=0
   
   ForEach departement()\vecteur()
    a+1
    WriteStringN(0,"PT"+Str(a)+" X: "+Str(departement()\vecteur()\x))
    WriteStringN(0,"PT"+Str(a)+" Y: "+Str(departement()\vecteur()\y))
   Next
   
   Debug a
   
  Next
  
  CloseFile(0)
 
 EndIf
 
 ; Select all the regions
 If Event = #PB_Event_Gadget And EventGadget() = 5
  CallDebugger
 EndIf
 
Until Event = #PB_Event_CloseWindow
 The happiness is a road...
The happiness is a road...Not a destination
Re: Create a map 2D with PB
Excuse me Kcc  code corrigé!
as usual, I am distracted 
 
best regards
			
			
									
									
						as usual, I am distracted
 
 best regards
- Kwai chang caine
- Always Here 
- Posts: 5502
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Create a map 2D with PB
No problem...i'm just surprising to have found the bug alone  
			
			
									
									
 The happiness is a road...
The happiness is a road...Not a destination





