Path: blob/master/loop-data2/shape_gen_script.py
105 views
# script to generate files for the loop shapes1# each block of code generates one loop shape23import pickle4import os5import math6import pygame7import numpy as np89# general function to reset radian angle to [-pi, pi)10def reset_radian(radian):11while radian >= math.pi:12radian = radian - 2*math.pi13while radian < -math.pi:14radian = radian + 2*math.pi15return radian1617# general function to calculate next position node along a heading direction18def cal_next_node(node_poses, index_curr, heading_angle, rep_times):19for _ in range(rep_times):20index_next = index_curr + 121x = node_poses[index_curr][0] + 1.0*math.cos(heading_angle)22y = node_poses[index_curr][1] + 1.0*math.sin(heading_angle)23node_poses[index_next] = np.array([x,y])24index_curr = index_next25return index_next2627# ##### script to generate 30-square #####28# filename = '30-square'29# swarm_size = 3030# node_poses = np.zeros((swarm_size, 2))31# x = 0.032# y = 0.033# # bottom side line34# # first node starting from bottom left corner35# node_poses[0] = np.array([0.0, 0.0])36# for i in range(1,8):37# x = x + 1.038# node_poses[i] = np.array([x,y])39# # right line line40# x = x + 1.0 / math.sqrt(2)41# y = y + 1.0 / math.sqrt(2)42# node_poses[8] = np.array([x,y])43# for i in range(9,16):44# y = y + 1.045# node_poses[i] = np.array([x,y])46# # top side line47# for i in range(16,23):48# x = x - 1.049# node_poses[i] = np.array([x,y])50# # left side line51# x = x - 1.0 / math.sqrt(2)52# y = y - 1.0 / math.sqrt(2)53# node_poses[23] = np.array([x,y])54# for i in range(24,30):55# y = y - 1.056# node_poses[i] = np.array([x,y])57# print("node_poses: {}".format(node_poses))58# with open(filename, 'w') as f:59# pickle.dump(node_poses, f)606162# ##### script to generate 100-square #####63# filename = '100-square'64# swarm_size = 10065# node_poses = np.zeros((swarm_size, 2))66# x = 0.067# y = 0.068# # bottom side line69# node_poses[0] = np.array([0.0, 0.0])70# for i in range(1,26):71# x = x + 1.072# node_poses[i] = np.array([x,y])73# # right line line74# for i in range(26,51):75# y = y + 1.076# node_poses[i] = np.array([x,y])77# # top side line78# for i in range(51,76):79# x = x - 1.080# node_poses[i] = np.array([x,y])81# # left side line82# for i in range(76,100):83# y = y - 1.084# node_poses[i] = np.array([x,y])85# print("node_poses: {}".format(node_poses))86# with open(filename, 'w') as f:87# pickle.dump(node_poses, f)888990# ##### script to generate 30-circle #####91# filename = '30-circle'92# swarm_size = 3093# node_poses = np.zeros((swarm_size, 2))94# center = np.zeros(2)95# radius = 0.5 / math.sin(math.pi/swarm_size)96# # first node starting from left most position97# for i in range(swarm_size):98# ori = -math.pi + 2*math.pi/swarm_size * i99# node_poses[i] = center + np.array([radius*math.cos(ori), radius*math.sin(ori)])100# print("node_poses: {}".format(node_poses))101# with open(filename, 'w') as f:102# pickle.dump(node_poses, f)103104105# ##### script to generate 100-circle #####106# filename = '100-circle'107# swarm_size = 100108# node_poses = np.zeros((swarm_size, 2))109# center = np.zeros(2)110# radius = 0.5 / math.sin(math.pi/swarm_size)111# # first node starting from left most position112# for i in range(swarm_size):113# ori = -math.pi + 2*math.pi/swarm_size * i114# node_poses[i] = center + np.array([radius*math.cos(ori), radius*math.sin(ori)])115# print("node_poses: {}".format(node_poses))116# with open(filename, 'w') as f:117# pickle.dump(node_poses, f)118119120# ##### script to generate 30-triangle #####121# filename = '30-triangle'122# swarm_size = 30123# node_poses = np.zeros((swarm_size, 2))124# # first node is at bottom left corner125# x = 0.0126# y = 0.0127# node_poses[0] = np.array([x,y])128# for i in range(1,11):129# x = x + 1.0130# node_poses[i] = np.array([x,y])131# for i in range(11,21):132# x = x + 1.0 * math.cos(math.pi*2/3)133# y = y + 1.0 * math.sin(math.pi*2/3)134# node_poses[i] = np.array([x,y])135# for i in range(21, 30):136# x = x + 1.0 * math.cos(-math.pi*2/3)137# y = y + 1.0 * math.sin(-math.pi*2/3)138# node_poses[i] = np.array([x,y])139# print("node_poses: {}".format(node_poses))140# with open(filename, 'w') as f:141# pickle.dump(node_poses, f)142143144# ##### script to generate 100-triangle #####145# filename = '100-triangle'146# swarm_size = 100147# node_poses = np.zeros((swarm_size, 2))148# side_angle = math.acos(17.0/33.0)149# # first node is at bottom left corner150# x = 0.0151# y = 0.0152# node_poses[0] = np.array([x,y])153# for i in range(1,35):154# x = x + 1.0155# node_poses[i] = np.array([x,y])156# for i in range(35,68):157# x = x + 1.0 * math.cos(math.pi-side_angle)158# y = y + 1.0 * math.sin(math.pi-side_angle)159# node_poses[i] = np.array([x,y])160# for i in range(68, 100):161# x = x + 1.0 * math.cos(-math.pi+side_angle)162# y = y + 1.0 * math.sin(-math.pi+side_angle)163# node_poses[i] = np.array([x,y])164# print("node_poses: {}".format(node_poses))165# with open(filename, 'w') as f:166# pickle.dump(node_poses, f)167168169# ##### script to generate 30-star #####170# filename = '30-star'171# swarm_size = 30172# node_poses = np.zeros((swarm_size, 2))173# outer_angle = 2*math.pi / 5.0174# devia_right = outer_angle175# devia_left = 2*outer_angle176# # first node is at bottom left corner177# heading_angle = outer_angle / 2.0 # current heading178# heading_dir = 0 # current heading direction: 0 for left, 1 for right179# seg_count = 0 # current segment count180# for i in range(1,swarm_size):181# node_poses[i] = (node_poses[i-1] +182# np.array([math.cos(heading_angle), math.sin(heading_angle)]))183# seg_count = seg_count + 1184# if seg_count == 3:185# seg_count = 0186# if heading_dir == 0:187# heading_angle = reset_radian(heading_angle - devia_right)188# heading_dir = 1189# else:190# heading_angle = reset_radian(heading_angle + devia_left)191# heading_dir = 0192# print(node_poses)193# with open(filename, 'w') as f:194# pickle.dump(node_poses, f)195196197# ##### script to generate 100-star #####198# filename = '100-star'199# swarm_size = 100200# node_poses = np.zeros((swarm_size, 2))201# outer_angle = 2*math.pi / 5.0202# devia_right = outer_angle203# devia_left = 2*outer_angle204# # first node is at bottom left corner205# heading_angle = outer_angle / 2.0 # current heading206# heading_dir = 0 # current heading direction: 0 for left, 1 for right207# seg_count = 0 # current segment count208# for i in range(1,swarm_size):209# node_poses[i] = (node_poses[i-1] +210# np.array([math.cos(heading_angle), math.sin(heading_angle)]))211# seg_count = seg_count + 1212# if seg_count == 10:213# seg_count = 0214# if heading_dir == 0:215# heading_angle = reset_radian(heading_angle - devia_right)216# heading_dir = 1217# else:218# heading_angle = reset_radian(heading_angle + devia_left)219# heading_dir = 0220# print(node_poses)221# with open(filename, 'w') as f:222# pickle.dump(node_poses, f)223224225# ##### script to generate 30-airplane #####226# filename = '30-airplane'227# swarm_size = 30228# node_poses = np.zeros((swarm_size, 2))229# # first node is at bottom center230# node_index = 0 # current sitting node231# heading_angle = - (14.0*math.pi)/180.0232# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)233# heading_angle = reset_radian(heading_angle + (130.0*math.pi)/180.0)234# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)235# heading_angle = reset_radian(heading_angle - (42.0*math.pi)/180.0)236# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)237# heading_angle = reset_radian(heading_angle - (94.0*math.pi)/180.0)238# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)239# heading_angle = reset_radian(heading_angle + (106.0*math.pi)/180.0)240# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)241# heading_angle = reset_radian(heading_angle + (55.0*math.pi)/180.0)242# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)243# heading_angle = reset_radian(heading_angle - (35.0*math.pi)/180.0)244# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)245# # half the airplane constructed, mirror the next half246# axis_vect = node_poses[node_index] - node_poses[0]247# axis_vect = axis_vect / np.linalg.norm(axis_vect)248# for i in range(1,15):249# old_vect = node_poses[i] - node_poses[0]250# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect251# print(node_poses)252# with open(filename, 'w') as f:253# pickle.dump(node_poses, f)254255256# ##### script to generate 100-airplane #####257# filename = '100-airplane'258# swarm_size = 100259# node_poses = np.zeros((swarm_size, 2))260# # first node is at bottom center261# node_index = 0 # current sitting node262# heading_angle = - (18.0*math.pi)/180.0263# node_index = cal_next_node(node_poses, node_index, heading_angle, 6)264# heading_angle = reset_radian(heading_angle + (135.0*math.pi)/180.0)265# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)266# heading_angle = reset_radian(heading_angle - (42.0*math.pi)/180.0)267# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)268# heading_angle = reset_radian(heading_angle - (94.0*math.pi)/180.0)269# node_index = cal_next_node(node_poses, node_index, heading_angle, 9)270# heading_angle = reset_radian(heading_angle + (106.0*math.pi)/180.0)271# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)272# heading_angle = reset_radian(heading_angle + (55.0*math.pi)/180.0)273# node_index = cal_next_node(node_poses, node_index, heading_angle, 12)274# heading_angle = reset_radian(heading_angle - (40.0*math.pi)/180.0)275# node_index = cal_next_node(node_poses, node_index, heading_angle, 10)276# # half the airplane constructed, mirror the next half277# axis_vect = node_poses[node_index] - node_poses[0]278# axis_vect = axis_vect / np.linalg.norm(axis_vect)279# for i in range(1,50):280# old_vect = node_poses[i] - node_poses[0]281# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect282# print(node_poses)283# with open(filename, 'w') as f:284# pickle.dump(node_poses, f)285286287# ##### script to generate 30-cross #####288# filename = '30-cross'289# swarm_size = 30290# node_poses = np.zeros((swarm_size, 2))291# node_index = 0292# heading_angle = 0.0293# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)294# heading_angle = math.pi/2295# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)296# heading_angle = 0.0297# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)298# heading_angle = math.pi/2299# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)300# heading_angle = -math.pi301# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)302# heading_angle = math.pi/2303# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)304# heading_angle = -math.pi305# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)306# heading_angle = -math.pi/2307# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)308# heading_angle = -math.pi309# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)310# heading_angle = -math.pi/2311# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)312# heading_angle = 0.0313# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)314# heading_angle = -math.pi/2315# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)316# print(node_index)317# print(node_poses)318# with open(filename, 'w') as f:319# pickle.dump(node_poses, f)320321322# ##### script to generate 100-cross #####323# filename = '100-cross'324# swarm_size = 100325# node_poses = np.zeros((swarm_size, 2))326# node_index = 0327# heading_angle = 0.0328# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)329# heading_angle = math.pi/2330# node_index = cal_next_node(node_poses, node_index, heading_angle, 17)331# heading_angle = 0.0332# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)333# heading_angle = math.pi/2334# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)335# heading_angle = -math.pi336# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)337# heading_angle = math.pi/2338# node_index = cal_next_node(node_poses, node_index, heading_angle, 7)339# heading_angle = -math.pi340# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)341# heading_angle = -math.pi/2342# node_index = cal_next_node(node_poses, node_index, heading_angle, 7)343# heading_angle = -math.pi344# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)345# heading_angle = -math.pi/2346# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)347# heading_angle = 0.0348# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)349# heading_angle = -math.pi/2350# node_index = cal_next_node(node_poses, node_index, heading_angle, 16)351# print(node_index)352# print(node_poses)353# with open(filename, 'w') as f:354# pickle.dump(node_poses, f)355356357# ##### script to generate 30-hand #####358# filename = '30-hand'359# swarm_size = 30360# node_poses = np.zeros((swarm_size, 2))361# node_index = 0362# heading_angle = 0.0363# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)364# heading_angle = reset_radian(heading_angle + (20.0*math.pi)/180.0)365# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)366# heading_angle = reset_radian(heading_angle + (20.0*math.pi)/180.0)367# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)368# heading_angle = reset_radian(heading_angle + (55.0*math.pi)/180.0)369# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)370# # small finger371# heading_angle = reset_radian(heading_angle - (15.0*math.pi)/180.0)372# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)373# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)374# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)375# heading_angle = reset_radian(heading_angle + (85.0*math.pi)/180.0)376# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)377# # middle finger(no ring finger)378# heading_angle = reset_radian(heading_angle - (147.0*math.pi)/180.0)379# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)380# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)381# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)382# heading_angle = reset_radian(heading_angle + (85.0*math.pi)/180.0)383# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)384# # index finger385# heading_angle = reset_radian(heading_angle - (147.0*math.pi)/180.0)386# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)387# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)388# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)389# heading_angle = reset_radian(heading_angle + (85.0*math.pi)/180.0)390# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)391# # thumb392# heading_angle = reset_radian(heading_angle - (125.0*math.pi)/180.0)393# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)394# heading_angle = reset_radian(heading_angle + (85.0*math.pi)/180.0)395# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)396# heading_angle = reset_radian(heading_angle + (85.0*math.pi)/180.0)397# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)398# print(node_index)399# print(node_poses)400# with open(filename, 'w') as f:401# pickle.dump(node_poses, f)402403404# ##### script to generate 100-hand #####405# filename = '100-hand'406# swarm_size = 100407# node_poses = np.zeros((swarm_size, 2))408# node_index = 0409# heading_angle = 0.0410# node_index = cal_next_node(node_poses, node_index, heading_angle, 6)411# heading_angle = reset_radian(heading_angle + (45.0*math.pi)/180.0)412# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)413# heading_angle = reset_radian(heading_angle + (35.0*math.pi)/180.0)414# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)415# # small finger416# heading_angle = reset_radian(heading_angle - (15.0*math.pi)/180.0)417# node_index = cal_next_node(node_poses, node_index, heading_angle, 6)418# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)419# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)420# heading_angle = reset_radian(heading_angle + (80.0*math.pi)/180.0)421# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)422# heading_angle = reset_radian(heading_angle + (44.0*math.pi)/180.0)423# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)424# heading_angle = reset_radian(heading_angle - (80.0*math.pi)/180.0)425# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)426# # ring finger427# heading_angle = reset_radian(heading_angle - (80.0*math.pi)/180.0)428# node_index = cal_next_node(node_poses, node_index, heading_angle, 7)429# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)430# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)431# heading_angle = reset_radian(heading_angle + (80.0*math.pi)/180.0)432# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)433# heading_angle = reset_radian(heading_angle + (44.0*math.pi)/180.0)434# node_index = cal_next_node(node_poses, node_index, heading_angle, 7)435# heading_angle = reset_radian(heading_angle - (80.0*math.pi)/180.0)436# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)437# # middle finger438# heading_angle = reset_radian(heading_angle - (80.0*math.pi)/180.0)439# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)440# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)441# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)442# heading_angle = reset_radian(heading_angle + (80.0*math.pi)/180.0)443# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)444# heading_angle = reset_radian(heading_angle + (44.0*math.pi)/180.0)445# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)446# heading_angle = reset_radian(heading_angle - (80.0*math.pi)/180.0)447# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)448# # index finger449# heading_angle = reset_radian(heading_angle - (80.0*math.pi)/180.0)450# node_index = cal_next_node(node_poses, node_index, heading_angle, 7)451# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)452# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)453# heading_angle = reset_radian(heading_angle + (80.0*math.pi)/180.0)454# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)455# heading_angle = reset_radian(heading_angle + (44.0*math.pi)/180.0)456# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)457# heading_angle = reset_radian(heading_angle - (10.0*math.pi)/180.0)458# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)459# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)460# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)461# # thumb462# heading_angle = reset_radian(heading_angle - (80.0*math.pi)/180.0)463# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)464# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)465# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)466# heading_angle = reset_radian(heading_angle + (80.0*math.pi)/180.0)467# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)468# heading_angle = reset_radian(heading_angle + (40.0*math.pi)/180.0)469# node_index = cal_next_node(node_poses, node_index, heading_angle, 9)470# heading_angle = reset_radian(heading_angle + (20.0*math.pi)/180.0)471# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)472# print(node_index)473# print(node_poses)474# with open(filename, 'w') as f:475# pickle.dump(node_poses, f)476477478# ##### script to generate 30-wrench #####479# filename = '30-wrench'480# swarm_size = 30481# node_poses = np.zeros((swarm_size, 2))482# node_index = 0483# heading_angle = 0.0484# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)485# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)486# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)487# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)488# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)489# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)490# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)491# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)492# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)493# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)494# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)495# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)496# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)497# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)498# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)499# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)500# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)501# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)502# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)503# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)504# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)505# # half the wrench is finished, mirror the next half506# axis_vect = node_poses[node_index] - node_poses[0]507# axis_vect = axis_vect / np.linalg.norm(axis_vect)508# for i in range(1,15):509# old_vect = node_poses[i] - node_poses[0]510# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect511# print(node_index)512# print(node_poses)513# with open(filename, 'w') as f:514# pickle.dump(node_poses, f)515516517# ##### script to generate 100-wrench #####518# filename = '100-wrench'519# swarm_size = 100520# node_poses = np.zeros((swarm_size, 2))521# node_index = 0522# heading_angle = 0.0523# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)524# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)525# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)526# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)527# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)528# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)529# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)530# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)531# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)532# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)533# node_index = cal_next_node(node_poses, node_index, heading_angle, 20)534# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)535# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)536# heading_angle = reset_radian(heading_angle + (50.0*math.pi)/180.0)537# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)538# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)539# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)540# heading_angle = reset_radian(heading_angle + (90.0*math.pi)/180.0)541# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)542# heading_angle = reset_radian(heading_angle - (50.0*math.pi)/180.0)543# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)544# # half the wrench is finished, mirror the next half545# axis_vect = node_poses[node_index] - node_poses[0]546# axis_vect = axis_vect / np.linalg.norm(axis_vect)547# for i in range(1,50):548# old_vect = node_poses[i] - node_poses[0]549# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect550# print(node_index)551# print(node_poses)552# with open(filename, 'w') as f:553# pickle.dump(node_poses, f)554555556# ##### script to generate 30-goblet #####557# filename = '30-goblet'558# swarm_size = 30559# node_poses = np.zeros((swarm_size, 2))560# node_index = 0561# arc_angle = 10.8 # default 11.25 deg562# heading_angle = 0.0563# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)564# heading_angle = reset_radian(heading_angle + (135*math.pi)/180.0)565# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)566# heading_angle = reset_radian(heading_angle + (30*math.pi)/180.0)567# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)568# heading_angle = math.pi/2569# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)570# heading_angle = (arc_angle*math.pi)/180.0571# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)572# heading_angle = reset_radian(heading_angle + (2*arc_angle*math.pi)/180.0)573# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)574# heading_angle = reset_radian(heading_angle + (2*arc_angle*math.pi)/180.0)575# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)576# heading_angle = reset_radian(heading_angle + (2*arc_angle*math.pi)/180.0)577# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)578# heading_angle = math.pi/2579# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)580# heading_angle = -math.pi581# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)582# # half the wrench is finished, mirror the next half583# axis_vect = node_poses[node_index] - node_poses[0]584# axis_vect = axis_vect / np.linalg.norm(axis_vect)585# for i in range(1,15):586# old_vect = node_poses[i] - node_poses[0]587# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect588# print(node_index)589# print(node_poses)590# with open(filename, 'w') as f:591# pickle.dump(node_poses, f)592593594# ##### script to generate 100-goblet #####595# filename = '100-goblet'596# swarm_size = 100597# node_poses = np.zeros((swarm_size, 2))598# node_index = 0599# arc_angle = 4.1600# heading_angle = 0.0601# node_index = cal_next_node(node_poses, node_index, heading_angle, 7)602# heading_angle = (120*math.pi)/180.0603# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)604# heading_angle = -math.pi605# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)606# heading_angle = math.pi/2607# node_index = cal_next_node(node_poses, node_index, heading_angle, 10)608# heading_angle = -(arc_angle*math.pi)/180.0609# for _ in range(10):610# heading_angle = reset_radian(heading_angle + (2*arc_angle*math.pi)/180.0)611# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)612# heading_angle = math.pi/2613# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)614# heading_angle = -math.pi615# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)616# # half the wrench is finished, mirror the next half617# axis_vect = node_poses[node_index] - node_poses[0]618# axis_vect = axis_vect / np.linalg.norm(axis_vect)619# for i in range(1,50):620# old_vect = node_poses[i] - node_poses[0]621# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect622# print(node_index)623# print(node_poses)624# with open(filename, 'w') as f:625# pickle.dump(node_poses, f)626627628# ##### script to generate 30-lamp #####629# filename = '30-lamp'630# swarm_size = 30631# node_poses = np.zeros((swarm_size, 2))632# node_index = 0633# heading_angle = 0.0634# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)635# heading_angle = (132*math.pi)/180.0636# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)637# heading_angle = ((180-15)*math.pi)/180.0638# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)639# heading_angle = math.pi/2640# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)641# heading_angle = 0.0642# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)643# heading_angle = (110*math.pi)/180.0644# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)645# heading_angle = -math.pi646# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)647# # half the wrench is finished, mirror the next half648# axis_vect = node_poses[node_index] - node_poses[0]649# axis_vect = axis_vect / np.linalg.norm(axis_vect)650# for i in range(1,15):651# old_vect = node_poses[i] - node_poses[0]652# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect653# print(node_index)654# print(node_poses)655# with open(filename, 'w') as f:656# pickle.dump(node_poses, f)657658659# ##### script to generate 100-lamp #####660# filename = '100-lamp'661# swarm_size = 100662# node_poses = np.zeros((swarm_size, 2))663# node_index = 0664# heading_angle = 0.0665# node_index = cal_next_node(node_poses, node_index, heading_angle, 6)666# heading_angle = (100*math.pi)/180.0667# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)668# heading_angle = (140*math.pi)/180.0669# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)670# heading_angle = (160*math.pi)/180.0671# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)672# heading_angle = (175*math.pi)/180.0673# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)674# heading_angle = math.pi/2675# node_index = cal_next_node(node_poses, node_index, heading_angle, 7)676# heading_angle = 0.0677# node_index = cal_next_node(node_poses, node_index, heading_angle, 10)678# heading_angle = (110*math.pi)/180.0679# node_index = cal_next_node(node_poses, node_index, heading_angle, 15)680# heading_angle = -math.pi681# node_index = cal_next_node(node_poses, node_index, heading_angle, 6)682# # half the wrench is finished, mirror the next half683# axis_vect = node_poses[node_index] - node_poses[0]684# axis_vect = axis_vect / np.linalg.norm(axis_vect)685# for i in range(1,50):686# old_vect = node_poses[i] - node_poses[0]687# node_poses[-i] = 2*np.dot(axis_vect, old_vect)*axis_vect - old_vect688# print(node_index)689# print(node_poses)690# with open(filename, 'w') as f:691# pickle.dump(node_poses, f)692693694# ##### script to generate 30-K #####695# filename = '30-K'696# swarm_size = 30697# node_poses = np.zeros((swarm_size, 2))698# node_index = 0699# angle_up = (50*math.pi)/180.0700# angle_down = -(50*math.pi)/180.0701# heading_angle = 0.0702# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)703# heading_angle = math.pi/2704# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)705# heading_angle = angle_down706# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)707# heading_angle = angle_up708# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)709# heading_angle = reset_radian(angle_down + math.pi)710# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)711# heading_angle = angle_up712# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)713# heading_angle = reset_radian(angle_down + math.pi)714# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)715# heading_angle = reset_radian(angle_up - math.pi)716# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)717# heading_angle = math.pi/2718# node_index = cal_next_node(node_poses, node_index, heading_angle, 2)719# heading_angle = -math.pi720# node_index = cal_next_node(node_poses, node_index, heading_angle, 1)721# heading_angle = -math.pi/2722# node_index = cal_next_node(node_poses, node_index, heading_angle, 6)723# print(node_index)724# print(node_poses)725# with open(filename, 'w') as f:726# pickle.dump(node_poses, f)727728729# ##### script to generate 100-K #####730# filename = '100-K'731# swarm_size = 100732# node_poses = np.zeros((swarm_size, 2))733# node_index = 0734# angle_up = (49*math.pi)/180.0735# angle_down = -(49*math.pi)/180.0736# heading_angle = 0.0737# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)738# heading_angle = math.pi/2739# node_index = cal_next_node(node_poses, node_index, heading_angle, 6)740# heading_angle = angle_up741# node_index = cal_next_node(node_poses, node_index, heading_angle, 3)742# heading_angle = angle_down743# node_index = cal_next_node(node_poses, node_index, heading_angle, 10)744# heading_angle = 0.0745# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)746# heading_angle = reset_radian(angle_down + math.pi)747# node_index = cal_next_node(node_poses, node_index, heading_angle, 14)748# heading_angle = angle_up749# node_index = cal_next_node(node_poses, node_index, heading_angle, 11)750# heading_angle = -math.pi751# node_index = cal_next_node(node_poses, node_index, heading_angle, 5)752# heading_angle = reset_radian(angle_up - math.pi)753# node_index = cal_next_node(node_poses, node_index, heading_angle, 10)754# heading_angle = math.pi/2755# node_index = cal_next_node(node_poses, node_index, heading_angle, 8)756# heading_angle = -math.pi757# node_index = cal_next_node(node_poses, node_index, heading_angle, 4)758# heading_angle = -math.pi/2759# node_index = cal_next_node(node_poses, node_index, heading_angle, 19)760# print(node_index)761# print(node_poses)762# with open(filename, 'w') as f:763# pickle.dump(node_poses, f)764765766767pygame.init()768# find the right world and screen sizes769x_max, y_max = np.max(node_poses, axis=0)770x_min, y_min = np.min(node_poses, axis=0)771pixel_per_length = 30772world_size = (x_max - x_min + 2.0, y_max - y_min + 2.0)773screen_size = (int(world_size[0])*pixel_per_length, int(world_size[1])*pixel_per_length)774# convert node poses in the world to disp poses on screen775def cal_disp_poses():776poses_temp = np.zeros((swarm_size, 2))777# shift the loop to the middle of the world778middle = np.array([(x_max+x_min)/2.0, (y_max+y_min)/2.0])779for i in range(swarm_size):780poses_temp[i] = (node_poses[i] - middle +781np.array([world_size[0]/2.0, world_size[1]/2.0]))782# convert to display coordinates783poses_temp[:,0] = poses_temp[:,0] / world_size[0]784poses_temp[:,0] = poses_temp[:,0] * screen_size[0]785poses_temp[:,1] = poses_temp[:,1] / world_size[1]786poses_temp[:,1] = 1.0 - poses_temp[:,1]787poses_temp[:,1] = poses_temp[:,1] * screen_size[1]788return poses_temp.astype(int)789disp_poses = cal_disp_poses()790# draw the loop shape on pygame window791color_white = (255,255,255)792color_black = (0,0,0)793screen = pygame.display.set_mode(screen_size)794screen.fill(color_white)795for i in range(swarm_size):796pygame.draw.circle(screen, color_black, disp_poses[i], 5, 0)797for i in range(swarm_size-1):798pygame.draw.line(screen, color_black, disp_poses[i], disp_poses[i+1], 2)799pygame.draw.line(screen, color_black, disp_poses[0], disp_poses[swarm_size-1], 2)800pygame.display.update()801802# # save the screen as image803# filepath = os.path.join('images',filename+'.png')804# pygame.image.save(screen, filepath)805806raw_input("<Press ENTER to exit>")807808809810811