Torus 3D

stage.frameRate = 30;
const TWO_PI:Number = Math.PI * 2;
var centerX:Number = 200;
var centerY:Number = 200;
var p:Array = new Array();
var zpos:Number;
var xpos:Number;
var ypos:Number;
var depth:Number;
var canvas:BitmapData = new BitmapData(400,400,true,0xFF000000);
addChild(new Bitmap(canvas));

var dy:Number = 0
var dx:Number = 0;
 
addEventListener(Event.ENTER_FRAME, onLoop);
function onLoop(evt:Event):void {
	canvas.fillRect(canvas.rect, 0xFF000000);
	 
	 dx += (mouseX / 100 - dx)/12;
	 dy += (mouseY / 100 - dy)/12;
	 var xp:Number, yp:Number, zp:Number;
	 
	 canvas.lock();
	 for (var a:Number =0; a < TWO_PI; a+=.08){
		  for (var b:Number =0; b < TWO_PI; b+=.08){
			  xp = (70 + 40 * Math.cos(a)) * Math.cos(b) ;
			  yp = (70 + 40 * Math.cos(a)) * Math.sin(b);
			  zp =  40 * Math.sin(a);
			  calc3D(xp, yp, zp, dx, dy);
			  convert3D();
			  canvas.setPixel(p[0], p[1], 0xFFFFFF);
		  }
	 }
	 canvas.unlock();
}
function calc3D(px:Number, py:Number, pz:Number, rotX:Number=0, rotY:Number=0):void {
	// I first learned this from code by Andries Odendaal - www.wireframe.co.za
	zpos=pz*Math.cos(rotX)-px*Math.sin(rotX) ;
	xpos=pz*Math.sin(rotX)+px*Math.cos(rotX) ;
	ypos=py*Math.cos(rotY)-zpos*Math.sin(rotY) ;
	zpos=py*Math.sin(rotY)+zpos*Math.cos(rotY);
}
function convert3D():void {
	depth = 1/((zpos/200)+1);
	p[0] =  xpos * depth + centerX;
	p[1] =  ypos * depth + centerY;
}

This code draws a rotating 3D torus using setPixel().

Leave a Reply

Your email address will not be published. Required fields are marked *