var verts:Vector.<Number> = new Vector.<Number>();
var pVerts:Vector.<Number> = new Vector.<Number>();
var uvts:Vector.<Number> = new Vector.<Number>();
var hs:Number = 2.3;
var step:Number = 0.04;
var tVerts:Vector.<Number> = new Vector.<Number>();
var rVerts:Vector.<Number> = new Vector.<Number>();
var matrix:Matrix3D = new Matrix3D();
matrix.identity();
matrix.appendRotation(45,Vector3D.Y_AXIS);
matrix.appendRotation(45,Vector3D.X_AXIS);
var inc:int = 0;
var i:Number, j:Number, k:Number;
i = hs;
while( i > -hs){
j = hs;
while(j > -hs){
k = hs;
while(k > -hs){
tVerts[inc] = -i;
inc++
tVerts[inc] = -j;
inc++
tVerts[inc] = -k;
inc++
k -= step;
}
j -= step;
}
i -= step;
}
matrix.transformVectors(tVerts, rVerts);
var vinc:int = 0;
inc = 0
var R:Number = 1.5;
var r:Number = .5;
for (i= -hs; i<hs; i+=step){
for (j = -hs; j<hs; j+=step){
for (k = -hs; k<hs; k+=step){
var vx:Number = rVerts[inc] ;
inc++
var vy:Number = rVerts[inc] ;
inc++
var vz:Number= rVerts[inc] ;
inc++
var s:Number = Math.pow(vx * vx + vy * vy + vz * vz + R*R - r * r, 2) - 4 * (R * R)*(vx * vx + vy * vy);
if (s <0 && s > -.5){
verts[vinc] = (i * 50);
vinc++
verts[vinc] = (j * 50);
vinc++
verts[vinc] = (k * 50);
vinc++
inc += int((hs - k) / step) * 3;
k = hs;
}
}
}
}
var canvas:BitmapData = new BitmapData(400,400,false, 0x000000);
addChild(new Bitmap(canvas));
render();
function render():void{
matrix.identity();
matrix.appendTranslation(200, 200, 0);
Utils3D.projectVectors(matrix, verts, pVerts, uvts);
canvas.lock();
canvas.fillRect(canvas.rect, 0x000000);
var inc:int = 2;
var c:int = 0;
var r:Rectangle = new Rectangle();
r.width = r.height = 2;
for (var i:int = 0; i<pVerts.length; i+=2){
r.x = pVerts[i];
r.y = pVerts[i + 1];
c = Math.max(0,100 - verts[inc]);
canvas.fillRect(r, c << 16 | c << 8 | c);
inc += 3;
}
canvas.unlock();
}
This snippet uses some of the techniques from the last few posts to create a distance render – this renders the implicit equation for a torus.