Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yangliu28
GitHub Repository: yangliu28/swarm_formation_sim
Path: blob/master/loop_reshape_reader.py
104 views
1
# a program dedicated to read stored loop formation data file, visualize it in pygame
2
3
# pass the filename of the loop formation file, it should be placed under 'loop-data'
4
# ex: "python loop_reshape_reader.py loop-filename"
5
6
import pygame
7
import sys, os
8
from formation_functions import *
9
10
# initialize the pygame
11
pygame.init()
12
13
# name of the folder that stores loop formation files
14
loop_folder = 'loop-data'
15
16
# parameters for display, window origin is at left up corner
17
screen_size = (600, 400) # width and height in pixels
18
color_black = (0,0,0)
19
color_white = (255,255,255)
20
robot_size = 6 # robot modeled as dot, number of pixels for radius
21
22
# set up the simulation window and surface object
23
icon = pygame.image.load("icon_geometry_art.jpg")
24
pygame.display.set_icon(icon)
25
screen = pygame.display.set_mode(screen_size)
26
pygame.display.set_caption("Loop Reader")
27
28
world_size = (100.0, 100.0 * screen_size[1]/screen_size[0])
29
loop_space = 4.0
30
31
# read passed filename
32
filename = sys.argv[1]
33
filepath = os.path.join(os.getcwd(), loop_folder, filename)
34
if not os.path.isfile(filepath):
35
print 'file "{}" does not exist'.format(filename)
36
sys.exit()
37
38
# instantiate node positions variable
39
nodes = []
40
nodes.append([0, 0])
41
nodes.append([loop_space, 0])
42
43
f = open(filepath, 'r') # read mode
44
poly_n = int(f.readline()) # get number of sides of the polygon
45
int_angles = []
46
newline = f.readline()
47
while len(newline) != 0:
48
int_angles.append(float(newline)) # add new interior angle
49
newline = f.readline()
50
# check if this file has appropriate number of interior angles as it indicated
51
if len(int_angles) != poly_n-3:
52
print 'file "{}" has incorrect number of interior angles'.format(filename)
53
sys.exit()
54
# construct the polygon with these interior angles
55
for i in range(2, poly_n):
56
nodes.append([0, 0]) # filled with [0, 0]
57
ori_current = 0 # orientation of current line segment
58
for i in range(2, poly_n-1):
59
int_angle_t = int_angles[i-2] # interior angle of node i-1
60
ori_current = reset_radian(ori_current + (math.pi - int_angle_t))
61
nodes[i][0] = nodes[i-1][0] + loop_space*math.cos(ori_current)
62
nodes[i][1] = nodes[i-1][1] + loop_space*math.sin(ori_current)
63
vect_temp = [nodes[0][0]-nodes[poly_n-2][0],
64
nodes[0][1]-nodes[poly_n-2][1]] # from node n-2 to 0
65
dist_temp = math.sqrt(vect_temp[0]*vect_temp[0]+
66
vect_temp[1]*vect_temp[1])
67
midpoint = [(nodes[poly_n-2][0]+nodes[0][0])/2,
68
(nodes[poly_n-2][1]+nodes[0][1])/2]
69
perp_dist = math.sqrt(loop_space*loop_space - dist_temp*dist_temp/4)
70
perp_ori = math.atan2(vect_temp[1], vect_temp[0]) - math.pi/2
71
nodes[poly_n-1][0] = midpoint[0] + perp_dist*math.cos(perp_ori)
72
nodes[poly_n-1][1] = midpoint[1] + perp_dist*math.sin(perp_ori)
73
74
# shift the polygon to the middle
75
# calculate the geometric center
76
geometry_center = [0, 0]
77
for i in range(poly_n):
78
geometry_center[0] = geometry_center[0] + nodes[i][0]
79
geometry_center[1] = geometry_center[1] + nodes[i][1]
80
geometry_center[0] = geometry_center[0]/poly_n
81
geometry_center[1] = geometry_center[1]/poly_n
82
# shift the polygon to the middle of the screen
83
for i in range(poly_n):
84
nodes[i][0] = nodes[i][0] - geometry_center[0] + world_size[0]/2
85
nodes[i][1] = nodes[i][1] - geometry_center[1] + world_size[1]/2
86
87
# draw the polygon
88
screen.fill(color_white)
89
disp_pos = [[0,0] for i in range(poly_n)]
90
for i in range(poly_n):
91
disp_pos[i] = world_to_display(nodes[i], world_size, screen_size)
92
pygame.draw.circle(screen, color_black, disp_pos[i], robot_size, 0)
93
for i in range(poly_n-1):
94
pygame.draw.line(screen, color_black, disp_pos[i], disp_pos[i+1], 2)
95
pygame.draw.line(screen, color_black, disp_pos[poly_n-1], disp_pos[0], 2)
96
pygame.display.update()
97
98
sim_exit = False # simulation exit flag
99
while not sim_exit:
100
# exit the program by close window button, or Esc or Q on keyboard
101
for event in pygame.event.get():
102
if event.type == pygame.QUIT:
103
sim_exit = True # exit with the close window button
104
if event.type == pygame.KEYUP:
105
if (event.key == pygame.K_ESCAPE) or (event.key == pygame.K_q):
106
sim_exit = True # exit with ESC key or Q key
107
108
109
110