- def __init__(self, start_vec, end_vec, vertices):
- self.start = start_vec # vector from position to first point
- self.end = end_vec # vector from position to last point
- self.vertices = vertices
-
- def poly(self, body, filter):
- shape = pymunk.Poly(body, self.vertices)
- shape.filter = filter
- return shape
-
- def within_limits(self, start_limit, end_limit):
- if start_limit is None or end_limit is None:
- return True
- print "----"
- print "LIM: ", start_limit, end_limit
- print "ANG: ", self.start.angle, self.end.angle
- n1 = self.start.normalized()
- n2 = self.end.normalized()
- s = pymunk.Vec2d(1, 0).rotated(start_limit)
- e = pymunk.Vec2d(1, 0).rotated(end_limit)
- n1bet = s.dot(e) < s.dot(n1) and s.dot(e) < s.dot(n1)
- n2bet = s.dot(e) < e.dot(n2) and s.dot(e) < e.dot(n2)
- print "DOTS n1: ", n1.dot(n2), n1.dot(s), n2.dot(s)
- print "DOTS n2: ", n1.dot(n2), n1.dot(e), n2.dot(e)
- print "BET: ", n1bet, n2bet
- if n1bet:
- print "TRUE\n----"
- return True
- return False
+ def __init__(self, position, vertices):
+ self.position = position # pointy end of the conical polygon
+ self.vertices = vertices # all vertices in the polygon
+
+ def _between(self, v, start, end):
+ if start < end:
+ return start <= v <= end
+ return (start <= v) or (v <= end)
+
+ def poly(self, start, end):
+ trial = pymunk.Poly(None, self.vertices)
+ trial.update(pymunk.Transform.identity())
+
+ if start is None or end is None:
+ return trial # no limits
+
+ start_info = trial.segment_query(
+ self.position + 1250 * start, self.position + 0.1 * start, 0)
+ end_info = trial.segment_query(
+ self.position + 1250 * end, self.position + 0.1 * end, 0)
+
+ vertices = self.vertices[:]
+ vertices = [
+ v for v in vertices
+ if self._between((v - self.position).angle, start.angle, end.angle)
+ ]
+ if start_info.shape is not None:
+ vertices.append(start_info.point)
+ if end_info.shape is not None:
+ vertices.append(end_info.point)
+ vertices.append(self.position)
+
+ poly = pymunk.Poly(None, vertices)
+ if len(poly.get_vertices()) < 3:
+ return None
+ return poly