/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/EGw7
*/
package {
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public var myObj:xObj = new xObj();
public function getMag(ax:Number,ay:Number,az:Number):Number
{ return Math.sqrt(ax*ax+ay*ay+az*az); }
public function onEnter(e:Event):void
{
graphics.clear();
graphics.lineStyle(2, 0);
drawBox2(0,0,0, 384,-16,384);
graphics.lineStyle(2, 0xFF0000);
goPos(myObj.vecVert[4], 232,232,232);
// goPos(myObj.vecVert[5], 232,182,232);
// goPos(myObj.vecVert[6], 232,182,232);
// goPos(myObj.vecVert[7], 232,182,232);
graphics.lineStyle(2, 0);
upVert(myObj.vecVert);
upSpring(myObj.vecSpring);
// myObj.vecVert[0].vx += 1;
// myObj.vecVert[7].vx -= 1;
/*
//try to brake the box
if (Math.random()<0.05)
{
var i:int;
i = myObj.vecVert.length * Math.random();
myObj.vecVert[i].vx += Math.random()*16-8;
myObj.vecVert[i].vy += Math.random()*16-8;
myObj.vecVert[i].vz += Math.random()*16-8;
}//endif
*/
}//onenter
public function upVert(vec:Vector.<xVert>):void
{
var a:xVert; var i:int; var num:int;
num = vec.length;
for(i=0;i<num;i+=1)
{
a = vec[i];
a.vy-=0.2;
a.vx*=0.99; a.vy*=0.99; a.vz*=0.99;
if (a.cy+a.vy<a.rad && a.vy<0){ a.vy -= a.vy; }
if (a.cx+a.vx<a.rad && a.vx<0){ a.vx -= a.vx; }
if (a.cz+a.vz<a.rad && a.vz<0){ a.vz -= a.vz; }
if (a.cx+a.vx>384 && a.vx>0){ a.vx -= a.vx; }
if (a.cz+a.vz>384 && a.vz>0){ a.vz -= a.vz; }
a.cx+=a.vx; a.cy+=a.vy; a.cz+=a.vz;
drawBox3(a.cx,0,a.cz, a.rad,1,a.rad);
drawBox3(a.cx,a.cy,a.cz, a.rad,a.rad,a.rad);
}//nexti
}//upvert
public function upSpring(vec:Vector.<xSpring>):void
{ var a:xSpring; var i:int; var num:int;
num = vec.length;
for(i=0;i<num;i+=1)
{
a = vec[i];
drawLine(a.va.cx, 0, a.va.cz, a.vb.cx, 0, a.vb.cz);
drawLine(a.va.cx, a.va.cy, a.va.cz, a.vb.cx, a.vb.cy, a.vb.cz);
spring(a.va, a.vb, a.rest, a.t);
}//nexti
}//uppsring
public var camx:Number = 0; public var camy:Number = 0; public var camz:Number = 0;
public var rendw:Number = 465 * 0.5; public var rendh:Number = 465 * 0.5;
public function drawLine(ax:Number, ay:Number, az:Number,
bx:Number, by:Number, bz:Number):void
{
var sx:Number; var sy:Number;
ax -= camx; ay -= camy; az -= camz;
bx -= camx; by -= camy; bz -= camz;
sx = ax - az + rendw; sy = (ax * 0.5) + (az * 0.5) - ay;
graphics.moveTo(sx,sy);
sx = bx - bz + rendw; sy = (bx * 0.5) + (bz * 0.5) - by;
graphics.lineTo(sx, sy);
}//drawline
public function drawBox3(ax:Number,ay:Number,az:Number,
rx:Number,ry:Number,rz:Number):void
{ drawBox(ax-rx,ay-ry,az-rz,ax+rx,ay+ry,az+rz); }
public function drawBox2(ax:Number,ay:Number,az:Number,
aw:Number,ah:Number,ad:Number):void
{ drawBox(ax,ay,az, ax+aw,ay+ah,az+ad); }
public function drawBox(ax:Number, ay:Number, az:Number,
bx:Number, by:Number, bz:Number):void
{
drawLine(ax, ay, az, bx, ay, az);
drawLine(ax, by, az, bx, by, az);
drawLine(ax, ay, bz, bx, ay, bz);
drawLine(ax, by, bz, bx, by, bz);
drawLine(ax, ay, az, ax, by, az);
drawLine(bx, ay, az, bx, by, az);
drawLine(ax, ay, bz, ax, by, bz);
drawLine(bx, ay, bz, bx, by, bz);
drawLine(ax, ay, az, ax, ay, bz);
drawLine(bx, ay, az, bx, ay, bz);
drawLine(ax, by, az, ax, by, bz);
drawLine(bx, by, az, bx, by, bz);
}//drawbox
public function goPos(a:xVert, ax:Number, ay:Number, az:Number, r:Number=32,t:Number=0.1):void
{
drawLine(ax,ay,az, a.cx, a.cy, a.cz);
var mag:Number; var dx:Number; var dy:Number; var dz:Number;
var kx:Number; var ky:Number; var kz:Number;
dx = ax-(a.cx+a.vx); dy= ay-(a.cy+a.vy); dz = az-(a.cz+a.vz);
mag = Math.sqrt(dx*dx+ dy*dy + dz*dz);
if (mag == 0) { mag =0.0001; }
dx/=mag; dy/=mag; dz/=mag;
r = mag-r;
kx = dx*r; ky = dy*r; kz = dz*r;
a.vx += (kx-a.vx)*t;
a.vy += (ky-a.vy)*t;
a.vz += (kz-a.vz)*t;
}//gopos
public function spring(a:xVert, b:xVert, rest:Number, t:Number=0.5):void
{
var ax:Number; var ay:Number; var az:Number;
var dx:Number; var dy:Number; var dz:Number;
var nx:Number; var ny:Number; var nz:Number;
var dist:Number; var mag:Number;
var reld:Number; var relvel:Number; var rem:Number;
dx = ((a.cx + a.vx) - (b.cx + b.vx));
dy = ((a.cy+a.vy) - (b.cy+b.vy));
dz = ((a.cz+a.vz) - (b.cz+b.vz));
mag = Math.sqrt(dx * dx + dy * dy + dz*dz);
if (mag == 0) {mag = Math.random(); a.cx += Math.random()-0.5; b.cy+=Math.random()-0.5;}
//if (mag == 0) { mag = 0.001; }
nx = dx / mag; ny = dy / mag; nz = dz/mag;
ax = a.vx - b.vx; ay = a.vy - b.vy; az = a.vz-b.vz;
relvel = (ax*nx) +(ay*ny) + (az*nz);
reld = mag - (rest+rest);
rem = relvel + reld;
rem*=0.5;
if (rem > 130) { rem = 130; }
else if (rem < -130) { rem = -130; }
a.vx += (rem * (nx * -t));
a.vy += (rem * (ny * -t));
a.vz += (rem * (nz * -t));
b.vx += (rem * (nx * t));
b.vy += (rem * (ny * t));
b.vz += (rem * (nz * t));
}//spring
}//classend
}
internal class xObj
{
public var vecVert:Vector.<xVert> = new Vector.<xVert>(0, false);
public var vecSpring:Vector.<xSpring> = new Vector.<xSpring>(0, false);
public function xObj()
{
vecVert.push(new xVert(230, 32, 230) );
vecVert.push(new xVert(230+32, 32, 230) );
vecVert.push(new xVert(230, 32, 230+32) );
vecVert.push(new xVert(230+32, 32, 230+32) );
vecVert.push(new xVert(230, 32+32, 230) );
vecVert.push(new xVert(230+32, 32+32, 230) );
vecVert.push(new xVert(230, 32+32, 230+32) );
vecVert.push(new xVert(230+32, 32+32, 230+32) );
/*
vecVert[0].rad = 18;
vecVert[1].rad = 18;
vecVert[2].rad = 18;
vecVert[3].rad = 18;
*/
var i:int; var k:int;
for (i=0;i<8;i+=1)
{
for (k=i+1;k<8;k+=1)
{
addSpring(vecVert[i], vecVert[k]);
}//nextk
}//nexti
/*
addSpring(vecVert[0], vecVert[1]);
addSpring(vecVert[0], vecVert[2]);
addSpring(vecVert[1], vecVert[3]);
addSpring(vecVert[2], vecVert[3]);
addSpring(vecVert[0], vecVert[3]);
addSpring(vecVert[1], vecVert[2]);
addSpring(vecVert[0], vecVert[4]);
addSpring(vecVert[1], vecVert[5]);
addSpring(vecVert[2], vecVert[6]);
addSpring(vecVert[3], vecVert[7]);
addSpring(vecVert[4], vecVert[5]);
addSpring(vecVert[4], vecVert[6]);
addSpring(vecVert[5], vecVert[7]);
addSpring(vecVert[6], vecVert[7]);
addSpring(vecVert[4], vecVert[7]);
addSpring(vecVert[5], vecVert[6]);
addSpring(vecVert[0], vecVert[7]);
addSpring(vecVert[4], vecVert[3]);
addSpring(vecVert[2], vecVert[5]);
addSpring(vecVert[3], vecVert[6]);
*/
}//ctor
public function getMag(ax:Number,ay:Number,az:Number):Number
{ return Math.sqrt(ax*ax+ay*ay+az*az); }
public function addSpring(a:xVert, b:xVert):void
{
var sp:xSpring;
sp = new xSpring();
sp.va = a; sp.vb = b;
sp.rest = getMag(a.cx-b.cx, a.cy-b.cy, a.cz-b.cz);
vecSpring.push(sp);
}//addspring
}//xobj
internal class xVert
{
public var rad:Number = 4;
public var cx:Number = 0; public var cy:Number = 0; public var cz:Number = 0;
public var vx:Number = 0; public var vy:Number = 0; public var vz:Number = 0;
public function xVert(ax:Number,ay:Number, az:Number) { cx=ax; cy=ay; cz=az;}
}//xvert
internal class xSpring
{
public var va:xVert = null;
public var vb:xVert = null;
public var rest:Number = 32;
public var t:Number = 0.5;
}//xspring