X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=tabakrolletjie%2Frays.py;h=b4142a3e6694f8ecaeb4f67264a4bb270ca7a025;hb=a2c09130986d18095773c96b9dc797f3b3eb542d;hp=6e98d83337d646f39f1d4c5d27f06e1c42f906d5;hpb=1cdc29cb8d944e3a25bb8518e00842201e6b9285;p=tabakrolletjie.git diff --git a/tabakrolletjie/rays.py b/tabakrolletjie/rays.py index 6e98d83..b4142a3 100644 --- a/tabakrolletjie/rays.py +++ b/tabakrolletjie/rays.py @@ -78,14 +78,16 @@ def to_pymunk_radians(deg): class RayPolyManager(object): def __init__( - self, body, position, ray_filter, radius_limits, angle_limits): + self, body, position, ray_filter, radius_limits, direction, + spread): self._body = body # light's body self._position = pymunk.Vec2d(position) # light's position self._ray_filter = ray_filter # light filter self._rays = [] # list of RayPolys + self._direction = None # normal vector for direction self._start = None # normal vector in direction of start angle limit self._end = None # normal vector in direction of end angle limit - self._set_angle_limits(angle_limits) + self._set_angle_limits(direction, spread) self._max_radius = None # maximum radius in pixels self._min_radius = None # minimum radius in pixels self._set_radius_limits(radius_limits) @@ -139,20 +141,36 @@ class RayPolyManager(object): else: self._max_radius = radius_limits[1] - def rotate_degrees(self, degrees): - self._start.rotate_degrees(degrees) - self._end.rotate_degrees(degrees) + def rotatable(self): + return self._direction is not None + + @property + def direction(self): + return self._direction.angle_degrees + + @direction.setter + def direction(self, degrees): + spread = self._direction.get_angle_between(self._start) + self._direction.angle_degrees = degrees + self._start = self._direction.rotated(spread) + self._end = self._direction.rotated(-spread) self._poly_cache = None - def _set_angle_limits(self, angle_limits): - if angle_limits is None: + @property + def spread(self): + if not self._direction: + return 2 * math.pi + return math.fabs(self._start.get_angle_between(self._end)) + + def _set_angle_limits(self, direction, spread): + if direction is None or spread is None: + self._direction = None self._start = None self._end = None else: - self._start = pymunk.Vec2d(1, 0).rotated( - to_pymunk_radians(angle_limits[0])) - self._end = pymunk.Vec2d(1, 0).rotated( - to_pymunk_radians(angle_limits[1])) + self._direction = pymunk.Vec2d(1, 0) + self._start = self._direction.rotated_degrees(-spread/2.) + self._end = self._direction.rotated_degrees(spread/2.) self._poly_cache = None def polys(self):