Advertisement
vovkakorben

Untitled

Feb 10th, 2022
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.89 KB | None | 0 0
  1. import sqlite3
  2. import codecs
  3. import pygame,pygame.freetype,pygame.gfxdraw
  4. import os, sys, traceback, random
  5. from pygame.locals import K_ESCAPE
  6. import math
  7.  
  8. # 5/5
  9. HOUSE_DENSITY = 5
  10. TRESHOLD = 5
  11.  
  12. #make_data = True
  13. make_data = False
  14.  
  15.  
  16. W = 1300
  17. H = 980
  18. MARGIN = 10
  19.  
  20. FPS = 10
  21. running = True
  22. clock = pygame.time.Clock()
  23.  
  24. CLR_BG = (0x14,0x1E,0x27)
  25. CLR_LINE = (0x004ee1)
  26. CLR_ADDED = (0xffff00)
  27. CLR_POINTS = (0xff483d)
  28. CLR_PTS = (0x3bd200)
  29. CLR_PTE = (0xd20000)
  30.  
  31.  
  32.  
  33. def line_len(x1,y1,x2,y2):
  34.         return math.sqrt( pow(x1-x2,2) + pow(y1-y2,2))
  35.  
  36.  
  37. try:
  38.     con = sqlite3.connect('map.db')
  39.     cur = con.cursor()
  40.  
  41.     # read data from text file
  42.     if make_data:
  43.         init = ["drop table if exists `names`;",
  44.         "CREATE TABLE `names` (`id` INTEGER PRIMARY KEY,`name` TEXT);",
  45.         "drop table if exists `coords`;",
  46.         "CREATE TABLE `coords` (`id` INTEGER,`order` INTEGER,`x` REAL,`y` REAL);",
  47.         ]
  48.         insert = [
  49.         "insert into `names` (`id`,`name`) VALUES({},'{}');",
  50.         "insert into `coords` (`id`,`order`,`x`,`y`) VALUES({},{},{},{});",
  51.         ]
  52.         closeup = ["CREATE INDEX `street_id` ON `coords` (id ASC);"]
  53.         for sql in init:
  54.             cur.execute(sql)
  55.         con.commit()
  56.  
  57.         count = 0
  58.         with codecs.open('corel.txt', encoding='utf-8') as f:
  59.             for line in f:
  60.                 line = line.strip()
  61.  
  62.                 # print ("#{} {}".format(count,line))
  63.                 a = line.split("\t")
  64.                
  65.                 # street name
  66.                 sql = insert[0].format(count,a[0])
  67.                 cur.execute(sql)
  68.                 con.commit()
  69.  
  70.                 #coords
  71.                 pt=0
  72.                 for cc in range(1,len(a)):
  73.                     coords = a[cc].split(",")
  74.                     sql = insert[1].format(count,pt,coords[0],coords[1])
  75.                     cur.execute(sql)
  76.                    
  77.                     pt+=1
  78.                 count+=1
  79.         con.commit()
  80.         f.close()  
  81.        
  82.         # создаем ключи
  83.         for sql in closeup:
  84.             cur.execute(sql)
  85.         con.commit()
  86.         del pt,a,cc,sql,count,line,coords,init,closeup,insert,f
  87.         print('-------------------------------------------------')        
  88.         print('База загружена из текстового файла')
  89.        
  90.  
  91.     del make_data
  92.  
  93.     nodes_count = -1
  94.     nodes = []
  95.     graph = []
  96.  
  97.  
  98.     cur.execute("select count(distinct id) from coords;")
  99.     rows = cur.fetchall()
  100.     cnt = rows[0][0]
  101.     print('-------------------------------------------------')        
  102.     print('Найдено в базе улиц: {}'.format(cnt))
  103.     for street_idx in range(cnt):
  104.         cur.execute("select x,y from coords where id={};".format(street_idx))
  105.         segments = cur.fetchall()  
  106.         nodes_count+=1
  107.  
  108.         # сохраняем первую точку первого сегмента
  109.         nodes.append({"street":street_idx,"segment":0,"x":segments[0][0],"y":segments[0][1]})
  110.        
  111.         for segment_idx in range(1,len(segments)):
  112.            
  113.            
  114.             # находим длину сегмента
  115.             l=line_len(segments[segment_idx-1][0],segments[segment_idx-1][1],segments[segment_idx][0],segments[segment_idx][1])
  116.            
  117.             # вычисляем, сколько у нас влезает "домов" на этот сегмент
  118.             house_per_segment = (int)(l // HOUSE_DENSITY)
  119.            
  120.             for sub in range(1,house_per_segment+1):
  121.                 # находим координты этого дома
  122.                 nx = segments[segment_idx-1][0] + (segments[segment_idx][0] - segments[segment_idx-1][0]) / house_per_segment * sub
  123.                 ny = segments[segment_idx-1][1] + (segments[segment_idx][1] - segments[segment_idx-1][1]) / house_per_segment * sub
  124.                
  125.                 # заносим его в ноды
  126.                 nodes.append({"street":street_idx,"segment":segment_idx-1,"x":nx,"y":ny})
  127.                 nodes_count+=1
  128.  
  129.                 # добавляем граф, с длиной
  130.                 sub_len = line_len( nodes[nodes_count-1]["x"],nodes[nodes_count-1]["y"], nx,ny)
  131.                 graph.append({"start":nodes_count-1,"end":nodes_count,"len":sub_len,"type":0})
  132.            
  133.  
  134.     del cnt,l,nx,ny,rows,street_idx,segment_idx,house_per_segment,sub,sub_len,segments,nodes_count
  135.  
  136.     graph_count = len(graph)
  137.     print('Создано нодов: {}'.format(len(nodes)))
  138.     print('Создано графов: {}'.format(graph_count))
  139.  
  140.     def graph_exists(graph,i,j):
  141.         for g in graph:
  142.             if (((g["start"]==i) and (g["end"]==j)) or ((g["start"]==j) and (g["end"]==i))):
  143.                 return True
  144.         return False
  145.    
  146.    
  147.     """
  148.    проверяем каждую точку улицы на близость со всеми точками со всех других улиц
  149.    если расстояние позволяет - делаем граф между ними
  150.    """
  151.    
  152.     """
  153.    for ns in range(len(nodes)):
  154.        for nd in range(len(nodes)):
  155.            # если разные улицы
  156.            if (nodes[ns]["street"] != nodes[nd]["street"]):
  157.                l = line_len(nodes[ns]["x"],nodes[ns]["y"],nodes[nd]["x"],nodes[nd]["y"])
  158.                if ((l<=TRESHOLD) and (not graph_exists(graph,ns,nd))):
  159.                    print("Connect {}-{}".format(ns,nd))  
  160.                    graph.append({"start":ns,"end":nd,"len":l,"type":1})  
  161.  
  162.    print('Добавлено графов: {}'.format(len(graph)-graph_count))
  163.    """
  164.  
  165.  
  166.    
  167.  
  168.     # calculate map map borders
  169.     minx = maxx = nodes[0]["x"]
  170.     miny = maxy = nodes[0]["y"]
  171.     for i in range(1,len(nodes)):
  172.         if (nodes[i]["x"]>maxx): maxx = nodes[i]["x"]
  173.         if (nodes[i]["x"]<minx): minx = nodes[i]["x"]
  174.         if (nodes[i]["y"]>maxy): maxy = nodes[i]["y"]
  175.         if (nodes[i]["y"]<miny): miny = nodes[i]["y"]
  176.    
  177.     # calculate map dimensions
  178.     dx = maxx - minx
  179.     dy = maxy - miny
  180.     kx = (W-MARGIN*2) / dx
  181.     ky = (H-MARGIN*2) / dy
  182.     k=kx if kx<ky else ky
  183.  
  184.     def geo2screen(pt):
  185.         global k,minx,miny,H
  186.         x = pt[0]-minx
  187.         y = pt[1]-miny
  188.         x *= k
  189.         y *= k
  190.         x += MARGIN
  191.         y += MARGIN
  192.         y = H - y # flip vertical
  193.         return [x,y]
  194.    
  195.     def screen2geo(pt):
  196.         global k,minx,miny,H
  197.         y = H - pt[1]
  198.         x = pt[0] - MARGIN
  199.         y = y - MARGIN
  200.         x /= k
  201.         y /= k
  202.         x += minx
  203.         y += miny
  204.         return [x,y]
  205.  
  206.  
  207.     pts = [100,100]
  208.     pte = [500,500]
  209.  
  210.     def calc_path(pts,pte):
  211.         global nodes
  212.         pts = screen2geo(pts)
  213.         pte = screen2geo(pte)
  214.         for n in nodes:
  215.                 pt = [ n["x"], n["y"] ]
  216.                 pt = geo2screen( pt )
  217.                 pygame.draw.circle(surf_act, CLR_POINTS, pt, 1, 0)
  218.  
  219.  
  220.  
  221.     calc_path(pts,pte)
  222.  
  223.     try:
  224.         pygame.init()
  225.         pygame.display.set_caption("Васька")
  226.         surf_act = pygame.display.set_mode((W, H))
  227.         #fnt = pygame.freetype.Font(os.path.join(scriptpath, 'app.ttf'), 10)
  228.  
  229.         while running:
  230.             for event in pygame.event.get():
  231.                 if event.type == pygame.QUIT: sys.exit()
  232.                 elif event.type == pygame.KEYDOWN:
  233.                     if (event.key == K_ESCAPE):
  234.                         running = False
  235.                 elif event.type == pygame.MOUSEBUTTONDOWN:
  236.                     if (event.button == 1): pts = event.pos
  237.                     elif (event.button == 3): pte = event.pos
  238.  
  239.  
  240.  
  241.  
  242.             # BG
  243.             surf_act.fill(CLR_BG)
  244.             # рисуем графы
  245.             for g in graph:
  246.                 pt0 = [ nodes[g["start"]]["x"], nodes[g["start"]]["y"] ]
  247.                 pt1 = [ nodes[g["end"]]["x"], nodes[g["end"]]["y"] ]
  248.                 pt0 = geo2screen( pt0 )
  249.                 pt1 = geo2screen( pt1 )
  250.                 if (g["type"]==0): pygame.draw.line(surf_act,CLR_LINE , pt0, pt1, 1)
  251.                 else :             pygame.draw.line(surf_act,CLR_ADDED, pt0, pt1, 1)
  252.             # рисуем домики
  253.             for n in nodes:
  254.                 pt = [ n["x"], n["y"] ]
  255.                 pt = geo2screen( pt )
  256.                 pygame.draw.circle(surf_act, CLR_POINTS, pt, 1, 0)
  257.                
  258.             pygame.draw.circle(surf_act, CLR_PTS, pts, 6, 0)
  259.             pygame.draw.circle(surf_act, CLR_PTE, pte, 6, 0)
  260.  
  261.             pygame.display.flip()
  262.             clock.tick(FPS)
  263.  
  264.     finally:
  265.         pygame.quit()
  266.                
  267.  
  268. except Exception as e:
  269.     print()
  270.     print("\n=-=-=- ERROR =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n")
  271.     e = sys.exc_info()[1]
  272.     print(e.args[0])
  273.     traceback.print_exc()
  274.     print("\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n")
  275.  
  276.  
  277.  
  278.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement