[ff]: Pie surface
forked from Pie surface (diff: 139)
ActionScript3 source code
/**
* Copyright bradsedito ( http://wonderfl.net/user/bradsedito )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/4JNg
*/
package
{
import flash.display.*
import flash.events.*
import flash.geom.*
public class Main extends Sprite
{
public const divider :Number = 18
public const dist :Number = 600
public var tolerance :Number = 6
public var faces :Array;
public var array :Array;
public var adds :Array;
public var core :Sprite;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// ENTRY POINT:
this.x = 465 / 2;
this.y = 465 / 2;
this.z = 0;
core = new Sprite();
core.y = tolerance/2; // (100 + tolerance) / 2;
core.rotationX = -40;
this.addChild(core);
array = [];
adds = [];
//
for (var it:int = 0; it < 360 / divider; it++)
{
var points:Array = [];
var adders:Array = [];
for (var dit:int = 0; dit < 20; dit++)
{
points.push(1 + Math.floor(Math.random() * tolerance) - tolerance / 2);
//points.push(100 + Math.floor(Math.random() * tolerance) - tolerance / 20);
adders.push((Math.random() * 10 - 5) / 1000);
//adders.push((Math.random() * 100 - 50) / 100);
}
array.push(points);
adds.push(adders);
}
setTriangles();
this.addEventListener(Event.ENTER_FRAME, piesurface);
}
public function setTriangles():void
{
faces = [];
for (var ind:int = 0; ind < array.length; ind++)
{
for (var dind:int = 0; dind < array[ind].length - 1; dind++)
{
if (ind < array.length - 1)
{
addNewTriangle(new Vector3D(Math.cos(ind * divider * Math.PI / 180) * dind * 10, -array[ind][dind], Math.sin(ind * divider * Math.PI / 180) * dind * 10),
new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * dind * 10, -array[(ind + 1)][dind], Math.sin((ind + 1) * divider * Math.PI / 180) * dind * 10),
new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (dind + 1) * 10, -array[ind][(dind + 1)], Math.sin(ind * divider * Math.PI / 180) * (dind + 1) * 10)
);
addNewTriangle(new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * dind * 10, -array[(ind + 1)][dind], Math.sin((ind + 1) * divider * Math.PI / 180) * dind * 10),
new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (dind + 1) * 10, -array[ind][(dind + 1)], Math.sin(ind * divider * Math.PI / 180) * (dind + 1) * 10),
new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (dind + 1) * 10, -array[(ind + 1)][(dind + 1)], Math.sin((ind + 1) * divider * Math.PI / 180) * (dind + 1) * 10)
);
}
else
{
addNewTriangle(new Vector3D(Math.cos((array.length - 1) * divider * Math.PI / 180) * dind * 10, -array[(array.length - 1)][dind], Math.sin((array.length - 1) * divider * Math.PI / 180) * dind * 10),
new Vector3D(Math.cos(0 * divider * Math.PI / 180) * dind * 10, -array[0][dind], Math.sin(0 * divider * Math.PI / 180) * dind * 10),
new Vector3D(Math.cos((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10, -array[(array.length - 1)][(dind + 1)], Math.sin((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10)
);
addNewTriangle(new Vector3D(Math.cos(0 * divider * Math.PI / 180) * dind * 10, -array[0][dind], Math.sin(0 * divider * Math.PI / 180) * dind * 10),
new Vector3D(Math.cos((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10, -array[(array.length - 1)][(dind + 1)], Math.sin((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10),
new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (dind + 1) * 10, -array[0][(dind + 1)], Math.sin(0 * divider * Math.PI / 180) * (dind + 1) * 10)
);
}
}
if (ind < array.length - 1)
{
addNewTriangle(new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, -array[ind][array[ind].length - 1], Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),
new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10, -array[(ind + 1)][array[(ind + 1)].length - 1], Math.sin((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10),
new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10)
);
addNewTriangle(new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10, -array[(ind + 1)][array[(ind + 1)].length - 1], Math.sin((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10),
new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),
new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10, 0, Math.sin((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10)
);
} else {
addNewTriangle(new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, -array[ind][array[ind].length - 1], Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),
new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10, -array[0][array[0].length - 1], Math.sin(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10),
new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10)
);
addNewTriangle(new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10, -array[0][array[0].length - 1], Math.sin(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10),
new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),
new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10, 0, Math.sin(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10)
);
}
}
}
public function addNewTriangle(v1:Vector3D, v2:Vector3D, v3:Vector3D):void {
faces.push( { v1:v1, v2:v2, v3:v3, vc:new Vector3D((v1.x + v2.x + v3.x) / 3, (v1.y + v2.y + v3.y) / 3, (v1.z + v2.z + v3.z) / 3) } );
}
public function piesurface(e:Event):void {
for (var i:int = 0; i < array.length; i++) {
for (var di:int = 0; di < array[i].length; di++) {
array[i][di] += adds[i][di];
adds [i][di] += (Math.random() * 10 - 5) / 10;
//adds[i][di] += (Math.random() * 100 - 50) / 100;
if (array[i][di] > 100 + tolerance * 2)
{
array[i][di] = 100 + tolerance * 2;
adds[i][di] = -Math.abs(adds[i][di]);
}
if (array[i][di] < 100 - tolerance * 2) {
array[i][di] = 100 - tolerance * 2;
adds[i][di] = Math.abs(adds[i][di]);
}
}
}
setTriangles();
// drawing the things out
core.rotationY = -mouseX;
core.rotationX = mouseY;
this.graphics.clear();
var sorted:Array = [];
for (var ind:int = 0; ind < faces.length; ind++) {
var v1:Vector3D = faces[ind].v1.clone();
var v2:Vector3D = faces[ind].v2.clone();
var v3:Vector3D = faces[ind].v3.clone();
var vc:Vector3D = faces[ind].vc.clone();
v1 = core.transform.matrix3D.transformVector(v1);
v2 = core.transform.matrix3D.transformVector(v2);
v3 = core.transform.matrix3D.transformVector(v3);
vc = core.transform.matrix3D.transformVector(vc);
v1.w = (v1.z + dist) / dist;
v2.w = (v2.z + dist) / dist;
v3.w = (v3.z + dist) / dist;
v1.project();
v2.project();
v3.project();
sorted.push( { v1:v1, v2:v2, v3:v3, z:vc.z } );
}
sorted.sortOn("z", Array.NUMERIC | Array.DESCENDING);
for (var dind:int = 0; dind < sorted.length; dind++) {
this.graphics.beginFill((0xFFFFFF*Math.random())+Math.abs(sorted[dind].z), 1);
//this.graphics.beginFill(Math.abs(sorted[dind].z), 1);
this.graphics.moveTo(sorted[dind].v1.x, sorted[dind].v1.y);
this.graphics.lineTo(sorted[dind].v2.x, sorted[dind].v2.y);
this.graphics.lineTo(sorted[dind].v3.x, sorted[dind].v3.y);
this.graphics.lineTo(sorted[dind].v1.x, sorted[dind].v1.y);
this.graphics.endFill();
}
}
}
}