Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/model.py
diff options
context:
space:
mode:
Diffstat (limited to 'model.py')
-rw-r--r--model.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/model.py b/model.py
new file mode 100644
index 0000000..7d29069
--- /dev/null
+++ b/model.py
@@ -0,0 +1,78 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import theme
+import kinematic
+
+class KeyFrame:
+ def __init__(self):
+ self.clear()
+
+ def empty(self):
+ return self.joints == None
+
+ def assign(self, x):
+ self.middle = x.middle
+ self.parts = x.parts.copy()
+ self.sticks = x.sticks.copy()
+ self.scaled_sticks = x.sticks.copy()
+ self.joints = x.joints.copy()
+ self.scaled_joints = initjoints()
+
+ scalesticks(self.scaled_sticks, .2)
+ setjoints(self.scaled_joints, self.scaled_sticks,
+ (self.x, int(theme.KEYFRAMEHEIGHT/2.0)))
+
+ def clear(self):
+ self.parts = None
+ self.sticks = None
+ self.scaled_sticks = None
+ self.joints = None
+ self.scaled_joints = None
+
+keys = []
+
+for i in range(5):
+ key = KeyFrame()
+ keyframe_width = theme.KEYFRAMEWIDTH/5
+ key.x = keyframe_width/2 + i*keyframe_width
+ keys.append(key)
+
+def initjoints():
+ joints = {}
+ for stickname in theme.JOINTS:
+ jname = theme.JOINTS[stickname]
+ joints[jname] = (0,0)
+ return joints
+
+def scalesticks(stickdict, i):
+ for key in stickdict:
+ (angle,len) = stickdict[key]
+ newlen = int(len * i)
+ stickdict[key] = (angle,newlen)
+
+def setjoints(joints, sticks, middle):
+ # have to traverse in order because
+ # parent joints must be set right
+ for stickname in theme.STICKLIST:
+ (angle,len) = sticks[stickname]
+ jname = theme.JOINTS[stickname]
+ (x,y) = kinematic.getparentjoint(jname, joints, middle)
+ parents = kinematic.getparentsticks(stickname)
+ panglesum = 0
+ for parentname in parents:
+ (pangle,plen) = sticks[parentname]
+ panglesum += pangle
+ (nx,ny) = kinematic.getpoints(x,y,angle+panglesum,len)
+ joints[jname] = (nx,ny)