-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenv.py
More file actions
125 lines (83 loc) · 3.14 KB
/
env.py
File metadata and controls
125 lines (83 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from topdown import TopDownView
import arcade
import pymunk
import random
from pymunk import Vec2d
import numpy as np
from elements import Carrot, Rabbit, Wall, WereRabbit
import time
from skimage import io
import math
from PIL import Image
from PIL import ImageShow
from sensors.rgb_topdown import CameraSensor
def dummy_handler(_arbiter, _space, _data):
w = _data['world']
w.count_collision += 1
return True
class RabbitWorld(arcade.Window):
def __init__(self, size, n_rabbits, n_wrabbits, n_carrots, seed):
super().__init__(1, 1, visible=False, antialiasing=True)
random.seed(seed)
self.w, self.h = size
self.size = size
self.space = pymunk.Space()
self.space.damping = 0.9
self.space.gravity = (0, 0)
hand = self.space.add_collision_handler(0, 1)
hand.post_solve = dummy_handler
hand.data['world'] = self
self.elems = []
self.ids = {}
self.count_collision = 0
self.elems.append(Wall(self, (-self.w/2, -self.h/2), (-self.w/2, self.h/2), 20))
self.elems.append(Wall(self, (-self.w/2, self.h/2), ( self.w/2, self.h/2), 20))
self.elems.append(Wall(self, ( self.w/2, self.h/2), ( self.w/2, -self.h/2), 20))
self.elems.append(Wall(self, (self.w/2, -self.h/2), (-self.w/2, -self.h/2), 20))
for _ in range(n_rabbits):
self.add_element('rabbit')
for _ in range(n_wrabbits):
self.add_element('wererabbit')
for _ in range(n_carrots):
self.add_element('carrot')
self.views = []
def get_id(self, elem):
id = 0
while True:
a = random.randint(0, 2**24)
if a not in self.ids:
id = a
break
self.ids[id] = elem
return id
@property
def all_ids(self):
return [elem.get_id_pixel() for elem in self.elems]
def add_element(self, elem_name):
x = random.randint(-self.w/2+30, self.w/2-30)
y = random.randint(-self.h/2+30, self.h/2-30)
angle = random.uniform(-2, 2)
if elem_name == 'rabbit':
elem = Rabbit(self, ((x, y), angle))
elif elem_name == 'wererabbit':
elem = WereRabbit(self, ((x, y), angle))
elif elem_name == 'carrot':
elem = Carrot(self, ((x, y), angle))
else:
raise ValueError
self.elems.append(elem)
def step(self):
for elem in self.elems:
if isinstance(elem, Rabbit) and random.uniform(0, 1) > 0.9:
fx = random.uniform(-10, 10)
fy = random.uniform(-10, 10)
angular_speed = random.uniform(-1, 1)
elem.body.velocity = fx, fy
elem.body.angular_velocity = angular_speed
self.space.step(dt=0.1)
if __name__ == '__main__':
env = RabbitWorld( (800, 200), n_rabbits=50, n_wrabbits=10, n_carrots=20, seed=42)
view = TopDownView(env, (0,0), (env.size[0], env.size[1]), scale=1, id_view=False)
env.step()
view.buf_update()
view.imdisplay()