summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgroup1 <f16_group1@pbridge.adm.cs.cmu.edu>2016-10-09 23:13:51 -0400
committergroup1 <f16_group1@pbridge.adm.cs.cmu.edu>2016-10-09 23:13:51 -0400
commit9b60deedc508c74b249fd1da0776b5a719322807 (patch)
tree5c133664660fb57545758a28f5f3aadcf48becb8
parent7e3a5627fc5052713ce4b843f3d98e3ecc557a57 (diff)
downloadbridge-9b60deedc508c74b249fd1da0776b5a719322807.tar.zst
Realistic small fish movement
-rw-r--r--bridge.py4
-rw-r--r--color.py13
-rw-r--r--fish_show.py48
3 files changed, 41 insertions, 24 deletions
diff --git a/bridge.py b/bridge.py
index 757d3c6..b7e4576 100644
--- a/bridge.py
+++ b/bridge.py
@@ -11,8 +11,8 @@ else:
have_lumiversepython = True
class Bridge(object):
- WIDTH = constants.BRIDGE_WIDTH
- HEIGHT = constants.BRIDGE_HEIGHT
+ WIDTH = BRIDGE_WIDTH
+ HEIGHT = BRIDGE_HEIGHT
def __init__(self):
if have_lumiversepython:
diff --git a/color.py b/color.py
index 058abb4..c65252b 100644
--- a/color.py
+++ b/color.py
@@ -7,7 +7,7 @@ class Vector(object):
__slots__ = ('x', 'y', 'z')
"""3-dimensional vector class."""
- def __init__(self, x, y, z):
+ def __init__(self, x=0, y=0, z=0):
"""Create a vector from its components."""
self.x = x
self.y = y
@@ -40,6 +40,17 @@ class Vector(object):
def __eq__(self, other):
return self.x == other.x and self.y == other.y and self.z == other.z
+ def unit(self):
+ return self / abs(self)
+
+ def rot2d(self, theta):
+ costheta = math.cos(theta)
+ sintheta = math.sin(theta)
+ new_x = self.x * costheta - self.y * sintheta
+ new_y = self.x * sintheta + self.y * costheta
+ return self.__class__(new_x, new_y)
+
+
@property
def components(self):
return (self.x, self.y, self.z)
diff --git a/fish_show.py b/fish_show.py
index f3ccf25..7cd8300 100644
--- a/fish_show.py
+++ b/fish_show.py
@@ -1,5 +1,6 @@
from __future__ import division
import color
+from color import Vector
import random
import constants
from constants import *
@@ -18,20 +19,23 @@ class Fish(object):
self.speed = step
self.step = step
- self.speed = Vector(10, 0)
- self.drag = -1
+ self.speed = Vector(0.1, 0)
+ self.drag = -0.09
- self.tailAcceleration = color.Vector(5, 0)
+ self.tailAccelMag = 0.4
+ self.tailAcceleration = Vector(self.tailAccelMag, 0)
self.tailDuration = 2
self.tailMoving = False
- self.tailThreshold = 5
+ self.tailThreshold = 0.7
self.tailMoveCount = 0
def update(self):
"""Swim gently to the other side of the bridge."""
- self.speed += self.drag * self.speed / abs(self.speed)
+ self.speed += self.drag * self.speed
if abs(self.speed) < self.tailThreshold:
self.tailMoving = True
+ self.tailThreshold = rand_in_range(0.5, 1.4)
+ self.fix_direction()
if self.tailMoveCount > self.tailDuration:
self.tailMoveCount = 0
self.tailMoving = False
@@ -47,22 +51,21 @@ class Fish(object):
self.x = -self.width
if self.x < -self.width:
self.x = constants.BRIDGE_WIDTH
- if self.y < -self.width:
- self.y = constants.BRIDGE_HEIGHT + self.height
- if self.y > -self.height:
- self.y = constants.BRIDGE_HEIGHT
- def fix_direction(self, theta=None):
- if theta is None:
- theta = random.random * math.pi / 2 - math.pi / 4
- costheta = math.cos(theta)
- sintheta = math.sin(theta)
- speedx = self.tailAcceleration.components[0]
- speedy = self.tailAcceleration.components[1]
- data.tailAcceleration = color.Vector(
- speedx * costheta - speedy * sintheta,
- speedx * sintheta + speedy * costheta
- )
+ print(self.x, self.y)
+
+ def fix_direction(self):
+ min_theta = -0.32
+ max_theta = 0.32
+ if self.y < 0:
+ min_theta = 0
+ if self.y > 1:
+ max_theta = 0
+
+ #theta = rand_in_range(min_theta, max_theta)
+ theta = random.gauss((max_theta+min_theta)/2, (max_theta - min_theta)/12)
+ self.tailAcceleration = Vector(self.tailAccelMag, 0).rot2d(theta)
+
class Light(object):
"""Represent a bridge light and its state."""
@@ -144,10 +147,13 @@ class FishShow(Show):
self.lights = [Light(x, y, self.bridge.get_light(x, y))
for y in xrange(self.bridge.HEIGHT)
for x in xrange(self.bridge.WIDTH)]
- self.fish = Fish(0, 0, 23, 1.5, color.black, 1)
+ self.fish = Fish(0, 0.5, 23, 1.5, color.black, 1)
def update(self):
self.fish.update()
for light in self.lights:
light.update(self.fish)
+
+def rand_in_range(low, high):
+ return random.random() * (high - low) + low