/* * leg.java * Aleksey Potashnik (cs184-bk) * Created on PC, NT4, MSJ++ 1.1 * Project 1 */ import vrml.*; import vrml.node.*; import vrml.field.*; public class leg extends Script { private SFRotation upper_rotation_changed; private SFRotation lower_rotation_changed; float upper = 1.8f, lower = 1.8f; float sum = upper + lower; public void initialize(){ upper_rotation_changed = (SFRotation)getEventOut("upper_rotation_changed"); lower_rotation_changed = (SFRotation)getEventOut("lower_rotation_changed"); } private void set_translation(float newX, float newY){ float r, a, b; newX = -newX; a = (float)Math.atan2(newX, newY); if (a == Float.NaN) return; r = (float)Math.sqrt(newX * newX + newY * newY); if (r > sum) { newX = sum * (float)Math.cos(a); newY = sum * (float)Math.sin(a); r = sum; } b = (float)Math.acos((r/2)/upper); if (b == Float.NaN) b = 0.0f; upper_rotation_changed. setValue(-1.0f, 0.0f, 0.0f, a + b + (float)Math.PI); lower_rotation_changed. setValue(-1.0f, 0.0f, 0.0f, -2*b); } public void processEvent (Event e){ String name = e.getName(); if (name.equals("set_translation")) set_translation(((ConstSFVec3f)e.getValue()).getX(), ((ConstSFVec3f)e.getValue()).getY()); } }