# Tag Archives: fp10

## Sphere of Squares

Actionscript:
1. [SWF(width = 600, height = 600, backgroundColor=0x000000)]
2. var squareNum:int  = 1000;
3. var hw:Number = stage.stageWidth / 2;
4. var hh:Number = stage.stageHeight / 2;
5. // verts defines a single square
6. var verts:Vector.<Number> = Vector.<Number>([-20, 0, 0, 20, 0, 0, 20, 0, 40, -20, 0, 40, -20, 0, 0]);
7. var cmds:Vector.<int> = Vector.<int>([1,2,2,2,2]);
8. var tempVerts:Vector.<Number> = new Vector.<Number>();
9. var newVerts:Vector.<Number> = new Vector.<Number>();
10. var pVerts:Vector.<Number> = new Vector.<Number>(10 * squareNum);
11. var uv:Vector.<Number> = new Vector.<Number>(15 * squareNum);
12. var vectors:Shape = new Shape();
13. var canvas:BitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false, 0x000000);
15. var blurred:BitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false, 0x000000);
16. var blur:BlurFilter = new BlurFilter(20,20,1);
17.
18. var m:Matrix3D = new Matrix3D();
19.
21. // duplicate the verts array a bunch of times
22. // each time moving the square to a random place on the
23. // circumference of a sphere
24. for (var i:int = 0; i<squareNum; i++){
25.     m.identity();
26.     var s:Number = Math.random()*.5 + .5;
27.     m.appendScale(s, s, s);
28.     m.appendRotation(90,Vector3D.X_AXIS);
30.     m.appendRotation(Math.random()*360,Vector3D.X_AXIS);
31.     m.appendRotation(Math.random()*360,Vector3D.Y_AXIS);
32.     m.appendRotation(Math.random()*360,Vector3D.Z_AXIS);
33.     m.transformVectors(verts,tempVerts);
34.     newVerts = newVerts.concat(tempVerts);
35.     cmds = cmds.concat(Vector.<int>([1,2,2,2,2]));
36. }
37. newVerts.fixed = pVerts.fixed = uv.fixed = true;
38. var dx:Number = 0, dy:Number = 0;
39. var pnt:Point = new Point();
41. function onLoop(evt:Event):void {
42.        dx += (mouseX - dx) / 4;
43.        dy += (mouseY - dy) / 4;
44.        m.identity();
45.        m.appendRotation(dx,Vector3D.Z_AXIS);
46.        m.appendRotation(dy,Vector3D.X_AXIS);
47.        m.appendTranslation(hw,hh, 0);
48.        Utils3D.projectVectors(m, newVerts, pVerts, uv);
49.        with(vectors.graphics){
50.            clear();
51.            beginFill(0xFFFFFF);
53.            beginFill(0x000000);
54.            drawPath(cmds, pVerts, GraphicsPathWinding.NON_ZERO);
55.        }
56.        canvas.fillRect(canvas.rect, 0x000000);
57.        canvas.draw(vectors);
58.        blurred.copyPixels(canvas, canvas.rect, pnt);
59.        blurred.applyFilter(blurred,blurred.rect, pnt, blur);
60.        canvas.draw(blurred, null, null, BlendMode.SCREEN);
61. }

This snippet is similar to yesterdays post but the visual result is rather different. This one does a little more Matrix3D stuff resulting in a sphere made up entirely of squares. This is obscured by the size of the squares and the fact that they overlap and cut each other up. BitmapData a BlurFilter and a BlendMode give the entire thing a slight glow...

Have a look at the swf here...

Posted in 3D, BitmapData, Vector | Also tagged , , | 12 Comments

## Bresenham’s Circle and setVector()

Actionscript:
1. var canvasSize:int = 400;
2. var canvas:BitmapData = new BitmapData(canvasSize, canvasSize, false, 0xFFFFFF);
4. var size:int = canvas.width * canvas.height;
5. var pixels:Vector.<uint> = canvas.getVector(canvas.rect);
6.
8. function onLoop(evt:Event):void {
9.      for (var i:int = 0; i<500; i++){
10.       fillCircle(int(Math.random() * canvasSize),
11.                       int(Math.random() * canvasSize),
12.                       int(Math.random() * 5 + 3),
13.                       uint(Math.random() * 0xFFFF));
14.      }
15.      canvas.lock();
16.      canvas.setVector(canvas.rect, pixels);
17.      canvas.unlock();
18. }
19.
20. function fillCircle(xp:int,yp:int, radius:int, col:uint = 0x000000):void {
21.     var xoff:int =0;
24.     while (xoff <= yoff) {
25.          var p0:int = xp - xoff;
26.          var p1:int = xp - yoff;
27.          var w0:int = xoff + xoff;
28.          var w1:int = yoff + yoff;
29.          hLine(p0, yp + yoff, w0, col);
30.          hLine(p0, yp - yoff, w0, col);
31.          hLine(p1, yp + xoff, w1, col);
32.          hLine(p1, yp - xoff, w1, col);
33.         if ((balance += xoff++ + xoff)>= 0) {
34.             balance-=--yoff+yoff;
35.         }
36.     }
37. }
38. function hLine(xp:int, yp:int, w:int, col:uint):void {
39.     var index:int = xp + yp * canvasSize;
40.     for (var i:int = 0; i <w; i++){
41.         index++;
42.         if (index> -1 && index <size){
43.           pixels[index] = col;
44.         }
45.     }
46. }

In the past I've posted examples of Bresenham's Circle (here and here). Both of those examples make use of setPixel(). Today's snippet demos a version of Bresenham's Circle that works with setVector().