topical media & game development
print /
present
basic trigonometric functions
sine of angle = opposite / hypotenuse
cosine of angle = adjacent / hypotenuse
tangent of angle = opposite / adjacent

convert radians to degrees
radians = degrees * Math.PI / 180
degrees = radians * 180 / Math.PI

rotate to mouse
dx = mouseX - sprite.x
dy = mouseY - sprite.y
sprite.rotation = Math.atan2(dy,dx) * 180 / Math.PI

create wave(s)
public function frame(event:Event) {
value = center + Math.sin(angle) * range;
angle += speed;
}

create circle(s)
public function frame(event:Event) {
x = centerX + Math.cos(angle) * radius;
y = centerY + Math.sin(angle) * radius;
angle += speed;
}

create oval(s)
public function frame(event:Event) {
x = centerX + Math.cos(angle) * radiusX;
y = centerY + Math.sin(angle) * radiusY;
angle += speed;
}

distance between point(s)
dx = x2 - x1;
dy = y2 - y1;
distance = Math.sqrt(dx*dx + dy*dy);

combine color(s)
color24 = red << 16 | green << 8 | blue;
color32 = alpha << 24 | red << 16 | green << 8 | blue;

extract color(s)
red = color24 >> 16;
green = color24 >> 8 & 0xFF;
blue = color24 & 0xFF;
alpha = color32 >> 24;
red = color32 >> 16;
green = color32 >> 8 & 0xFF;
blue = color32 & 0xFF;

draw curve(s)
// draw through (xt,yt) with endpoints (x0,y0) and (x2,y2)
x1 = xt * 2 - (x0 + x2)/2;
y1 = xt * 2 - (y0 + y2)/2;
moveTo(x0,y0);
curveTo(x1,y1,x2,y2);

convert angular velocity(s)
vx = speed * Math.cos(angle);
vy = speed * Math.sin(angle);

convert angular acceleration(s)
ax = force * Math.cos(angle);
ay = force * Math.sin(angle);

add velocity(s)
sprite.x += vx;
sprite.y += vy;

add acceleration(s)
vx += ax;
vy += ay;

out-of-bound(s)
if ( sprite.x - sprite.width/2 > right ||
sprite.x + sprite.width/2 < left ||
sprite.y - sprite.height/2 > bottom ||
sprite.y + sprite.height/2 < top )
{
...
}

out-of-bound wrap(s)
if (sprite.x - sprite.width/2 > right) {
sprite.x = left - sprite.width/2;
} else if (sprite.x + sprite.width/2 < left} {
sprite.x = right + sprite.width/2;
} if (sprite.y - sprite.height/2 > bottom) {
sprite.y = top - sprite.height/2;
} else if (sprite.y + sprite.height/2 < top)
sprite.y = bottom + sprite.height/2;
}

correct friction(s)
speed = Math.sqrt(vx*vx + vy*vy);
angle = Math.atan2(vy,vx);
if (speed > friction) { speed -= friction; }
else { speed = 0; }

easy friction(s)
vx *= friction;
vy *= friction;

easing(s)
dx = targetX - sprite.x;
dy = targetY - sprite.y;
vx = dx * easing;
vy = dy * easing;
sprite.x += vx;
sprite.y += vy;

spring(s)
ax = (targetX - sprite.x) * spring;
ay = (targetY - sprite.y) * spring;
vx += ax;
vy += ay;
vx *= friction;
vy *= friction;
sprite.x += vx;
sprite.y += vy;

offset(s)
dx = sprite.x - fixedX;
dy = sprite.y - fixedY;
angle = Math.atan2(dy,dx);
targetX = fixedX + Math.cos(angle) * springLength;
targetY = fixedY + Math.sin(angle) * springLength;
// spring to target

collision(s)
dx = spriteB.x - spriteA.x;
dy = spriteB.y - spriteB.y;
distance = Math.sqrt(dx*dx + dy*dy);
if (distance < spriteA.radius + spriteB.radius) {
...
}

multiple collision(s)
var max:Number = ...;
for (var i:uint; i < max; i++) {
var objectA = objects[i];
for (var j:uint = i - 1; j < max; j++) {
var objectB = objects[j];
}
}

coordinate rotation(s)
x1 = Math.cos(angle) * x - Math.sin(angle) * y;
y1 = Math.cos(angle) * y + Math.sin(angle) * x;

reverse coordinate rotation(s)
x1 = Math.cos(angle) * x + Math.sin(angle) * y;
y1 = Math.cos(angle) * y - Math.sin(angle) * x;

momentum conservation(s)
vxTotal = vx0 - vx1;
vx0 = ((ball0.mass - ball1.mass) * vx0 + 2 * ball1.mass * vx1) /
(ball0.mass + ball1.mass);
vx1 = vxTotal + vx0;

gravitation(s)
dx = partB.x - partA.x;
dy = partB.y - partA.y;
distSQ = dx*dx + dy*dy;
distance = Math.sqrt(distSQ);
force = partA.mass * partB.mass / distSQ;
ax = force * dx / distance;
ay = force * dy / distance;
partA.vx += ax / partA.mass;
partA.vy += ay / partA.mass;
partB.vx += ax / partB.mass;
partB.vy += ay / partB.mass;

law of cosine(s)
angleA = Math.acos((b*b + c*c - a*a) / (2 * b * c));
angleB = Math.acos((a*a + c*c - b*b) / (2 * a * c));
angleC = Math.acos((a*a + b*b - c*c) / (2 * a * b));

basic perspective(s)
scale = fl / (fl + zpos);
sprite.scaleX = sprite.scaleY = scale;
sprite.alpha = scale; // optional
sprite.x = vanishingPointX + xpos * scale;
sprite.y = vanishingPointY + ypos * scale;

Z sorting(s)
// array of 3D object with zpos property;
objectArray.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
for (var i:unint; i < numObjects; i++) {
setChildIndex(objectArray[i].i);
}

coordinate rotation(s)
x1 = Math.cos(angleZ) * xpos - Math.sin(angleZ) * ypos;
y1 = Math.cos(angleZ) * ypos + Math.sin(angleZ) * xpos;
x1 = Math.cos(angleY) * xpos - Math.sin(angleY) * zpos;
z1 = Math.cos(angleY) * zpos + Math.sin(angleY) * xpos;
y1 = Math.cos(angleX) * ypos - Math.sin(angleX) * zpos;
z1 = Math.cos(angleX) * zpos + Math.sin(angleX) * ypos;

3D distance(s)
distance = Math.sqrt(dx*dx + dy*dy + dz*dz);

(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.