animation of composition using functions
code
#include "../CanvasPlus.as"
/*
task05 :: pfa
This program extends the hopi kachina character by animating it
with time-based behavior.
Justin Grossman :: 10.30.03
*/
// functions ///////////////////////////////////////////////////////////
// increments a value (by a normalized amount)
function IncrementIt(oldvalue) {
var newvalue = oldvalue+0.35;
//massage the added value to change characteristics
if (newvalue>1) {
newvalue = Math.abs(1-oldvalue);
}
return newvalue;
}
// opposite as IncrementIt();
function DecrementIt(oldvalue) {
var newvalue = oldvalue-0.05;
if (newvalue<0) {
newvalue = Math.abs(1+oldvalue);
}
return newvalue;
}
// draws a shape (3sided right-angled)
function genTri(startpt_x, startpt_y, endpt_x, endpt_y) {
var pt1 = new Array(startpt_x, startpt_y);
var pt2 = new Array(startpt_x, endpt_y);
var pt3 = new Array(endpt_x, endpt_y);
var mytri = new Array(pt1, pt2, pt3);
return mytri;
}
// generates a clockwise array of x,y array pairs of points from upper left to feed into Canvas.drawRegion (for a trapezoid)
// for some reason, doesn't work with drawRegion, so omitted
function genTrap(startpt_x, startpt_y, width_top, width_base, height) {
var basediff = 0.5*(width_top-width_base);
var ltop = new Array(startpt_x, startpt_y);
var rtop = new Array(startpt_x+width_top, startpt_y);
var rbase = new Array(startpt_x+width_top-basediff, startpt_y+height);
var lbase = new Array(startpt_x+basediff, startpt_y+height);
var trap_array = new Array(ltop, rtop, rbase, lbase);
// trace("basediff: "+basediff+" fcn: "+trap_array);
return trap_array;
}
function makeOutline() {
var r = .1;
var b = .1;
var g = .1;
Canvas.setPenColor(r,g,b);
}
function cartesianToPolar(x, y) {
// converts cartesian x,y to polar [distance, angle]
var distance = Math.sqrt(x*x+y*y);
var radianAngle;
if (x == 0) {
if (y>=0) {
radianAngle = Math.PI*.5;
} else {
radianAngle = 3*Math.PI*.5;
}
} else if (x>0) {
radianAngle = Math.atan(y/x);
} else {
radianAngle = Math.PI-Math.atan(y/-x);
}
return new Array(distance, radianAngle);
}
function polarToCartesian(distance, radianAngle) {
// converts polar distance, angle to cartesian [x, y]
var x = distance*Math.cos(radianAngle);
var y = distance*Math.sin(radianAngle);
return new Array(x, y);
}
function drawears() {
var mydate = new Date;
var secs = mydate.getSeconds();
secs = (secs % 10) / 100;
var lx = .5 - secs;
var rx = .5 + secs;
var lear_pts = genTri(lx, .13, .445, .25);
var rear_pts = genTri(rx, .13, .555, .25);
var r = 0.6;
var g = 0.5;
var b = 0.4;
Canvas.setPenColor(r, g, b);
Canvas.drawRegion(true, lear_pts);
Canvas.drawRegion(true, rear_pts);
}
function drawbody() {
// setup for drawing body ////////////////////////////////////////////
makeOutline();
var filltrue = true;
var fillfalse = false;
var bodyx = .4;
var bodyy = .2;
var bodyw = .2;
var bodyh = .6;
var rad = .25;
Canvas.drawRectangle(fillfalse, bodyx, bodyy, bodyw, bodyh, rad);
var r = 0.2;
var g = 0.1;
var b = 0.1;
Canvas.setPenColor(r, g, b);
Canvas.drawRectangle(filltrue, bodyx+.002, bodyy+.002, bodyw-.004, bodyh-.004, rad);
}
function drawface() {
// setup for drawing eyes and facial details //////////////////////////
// light parts
// eyes
var r = .99;
var b = .99;
var g = .99;
Canvas.setPenColor(r, g, b);
var leyex = .46;
var reyex = .54;
var eyey = .25;
var eyer_outer = .015;
var eyer_inner = .005;
var filltrue = true;
var fillfalse = false;
Canvas.drawOval(filltrue, leyex, eyey, eyer_outer, eyer_outer);
Canvas.drawOval(filltrue, reyex, eyey, eyer_outer, eyer_outer);
//snout
var snoutx = .5;
var snouty = .33;
var snoutrx = .04;
var snoutry = .06;
Canvas.drawOval(filltrue, snoutx, snouty, snoutrx, snoutry);
//freckles
var freckrad = .004;
var centerpointx = .5;
var yhoriz = .29;
Canvas.drawOval(filltrue, centerpointx + .045, yhoriz, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx - .045, yhoriz, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx + .06, yhoriz, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx - .06, yhoriz, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx + .075, yhoriz, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx - .075, yhoriz, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx + .051, yhoriz + .015, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx - .051, yhoriz + .015, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx + .058, yhoriz + .029, freckrad, freckrad);
Canvas.drawOval(filltrue, centerpointx - .058, yhoriz + .029, freckrad, freckrad);
//forehead
var forex = .5;
var forey = .203;
var foreradx = .09;
var forerady = .005;
Canvas.drawOval(filltrue, forex, forey, foreradx, forerady);
//dark parts
//pupils
var r = .2;
var g = .1;
var b = .1;
Canvas.setPenColor(r, g, b);
var mydate = new Date;
var secs = mydate.getSeconds();
secs = (secs % 10) / 1000;
var lpupilx = leyex + secs;
var rpupilx = reyex + secs;
Canvas.drawOval(filltrue, lpupilx, eyey, eyer_inner, eyer_inner);
Canvas.drawOval(filltrue, rpupilx, eyey, eyer_inner, eyer_inner);
//nostril
Canvas.drawOval(filltrue, .5, .3, .005, .005);
//forehead
Canvas.drawOval(fillfalse, forex, forey, foreradx, forerady);
}
function drawtorso() {
// setup for torso ///////////////////////////////////////////////////
var filltrue = true;
var fillfalse = false;
var torsox = .35;
var torsoy = .33;
var torsow = .3;
var torsoh = .17;
var rad = .1;
var r = 0.2;
var g = 0.1;
var b = 0.1;
Canvas.setPenColor(r, g, b);
Canvas.drawRectangle(filltrue, torsox+.002, torsoy+.002, torsow-.004, torsoh-.004, rad);
makeOutline();
Canvas.drawRectangle(fillfalse, torsox, torsoy, torsow, torsoh, rad);
//carves out arms
r = 0;
g = 0;
b = 0;
Canvas.setPenColor(r, g, b);
Canvas.drawLine(.4, .38, .398, .5);
Canvas.drawLine(.601, .38, .603, .5);
}
function drawkilt() {
// draws kilt
var trap_pts = genTrap(.399, .501, .202, .25, .17);
var r = 0.6;
var g = 0.5;
var b = 0.4;
Canvas.setPenColor(r, g, b);
Canvas.drawRegion(true, trap_pts);
makeOutline();
Canvas.drawRegion(false, trap_pts);
}
function cutlegs() {
// cuts out legs
var r = 0.9;
var g = 0.9;
var b = 0.9;
Canvas.setPenColor(r, g, b);
var trap_pts = genTrap(.48, .675, .035, .055, .13);
Canvas.drawRegion(true, trap_pts);
}
function drawhands() {
var r = 1;
var b = 1;
var g = 1;
Canvas.setPenColor(r, g, b);
var lx = .36;
var ly = .5;
var rx = .61;
var ry = .5;
var cx = .45;
var cy = .37;
var chandwidtht = .1;
var chandwidthb = .06;
var chandheight = .08;
var handwidtht = .03;
var handwidthb = .05;
var handheight = .04;
var filltrue = true;
var fillfalse = false;
var lhand = gentrap(lx, ly, handwidtht, handwidthb, handheight);
var rhand = gentrap(rx, ry, handwidtht, handwidthb, handheight);
var chand = gentrap(cx, cy, chandwidtht, chandwidthb, chandheight);
Canvas.drawRegion(filltrue, lhand);
Canvas.drawRegion(filltrue, rhand);
Canvas.drawRegion(filltrue, chand);
// draw outlines and fingers
makeOutline();
Canvas.drawRegion(fillfalse, lhand);
Canvas.drawRegion(fillfalse, rhand);
Canvas.drawRegion(fillfalse, chand);
var rxdec = rx + handwidtht;
for(i = 0; i < 4; i++) {
lx += .008;
rxdec -= .008;
cx += .015;
Canvas.drawLine(lx, ly + .015, lx - .008, ly + handheight);
Canvas.drawLine(rxdec, ry + .015, rxdec + .008, ry + handheight);
Canvas.drawLine(cx, cy, cx + .015, cy + chandheight - .035);
}
}
function drawCharacter() {
// set light background color
var bg_r = .9;
var bg_g = .9;
var bg_b = .9;
Canvas.setBackgroundColor(bg_r, bg_g, bg_b);
// setup for pen colors, and properties
makeOutline();
var penweight = 0.01;
Canvas.setPenWeight(penweight);
drawears();
drawbody();
drawface();
drawtorso();
drawhands();
drawkilt();
cutlegs();
}
// end functions ///////////////////////////////////////////////////////
_root.onEnterFrame = drawCharacter;
// end ///////////////////////////////////////////////////////////////////