/*
 * 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());
	}
}