# Monthly Archives: May 2009

## Difference Between Two Angles

Actionscript:
1. // from http://codebase.dbp-site.com/code/find-difference-between-two-angles-25
2. function angleDifference(angle0:Number, angle1:Number):Number{
3.     return Math.abs((angle0 + 180 -  angle1) % 360 - 180);
4. }
5.
6. trace("get the angle between:");
7. trace("350 and 10 =", angleDifference(350, 10));
8. trace("180 and -1 =", angleDifference(180, -1));
9. trace("-10 and 5 =", angleDifference(-10, 5));
10. trace("725 and -45 =", angleDifference(725, -45));
11. /* outputs:
12. get the angle between:
13. 350 and 10 =  20
14. 180 and -1 =  179
15. -10 and 5 =  15
16. 725 and -45 =  50
17. */

This snippet shows an easy way to find the difference between two angles. The tricky part about doing this is finding the difference between something like 350 and 1 (which should be 11).

Over the years I have done this a few different ways - I needed it for something today and realized that my way was a tad clunky (had a little redundant logic) - So with a quick google search I found a more elegant solution.

Posted in Math, misc, motion | Tagged , | 9 Comments

## Mouse.cursor

Actionscript:
1. var count:int = 0;
2. var cursors:Array = [MouseCursor.ARROW, MouseCursor.BUTTON, MouseCursor.HAND, MouseCursor.IBEAM];
3. setInterval(changeMouse, 100);
4. function changeMouse():void{
5.     Mouse.cursor = cursors[count % cursors.length];
6.     count++;
7. }

This is a small snippet that shows the cursor property of the Mouse class. This is fp10 only...

Actionscript:
1. [SWF(width=600,height=500,frameRate=30)]
2. var canvas:BitmapData=new BitmapData(600,500,false,0x000000);
4. var size:Number=canvas.width*canvas.height;
5. var w:Number=canvas.width;
6. var wd:Number=1/w;
7. var pix:Vector.<uint> = new Vector.<uint>();
8. var sin:Number;
9. var cos:Number;
10. var dx:Number=110;
11. var dy:Number=52;
13. function onLoop(evt:Event):void {
14.     dx+=0.001;
15.     canvas.lock();
16.     for (var i:int = 0; i<size; i++) {
17.         var xp:Number=i%w;
18.         var yp:Number=int(i*wd);
19.         var xx:Number=xp*0.05+dx;
20.         var yy:Number=yp*0.05+dy;
21.         var t:Number= (xx * yy) % 3.14159265;
22.         //compute sine
23.         // technique from http://lab.polygonal.de/2007/07/18/fast-and-accurate-sinecosine-approximation/
24.         // by Michael Baczynski
25.         if (t<0) {
26.             sin=1.27323954*t+.405284735*t*t;
27.         } else {
28.             sin=1.27323954*t-0.405284735*t*t;
29.         }
30.         //compute cosine: sin(t + PI/2) = cos(t)
31.         t+=1.57079632;
32.         if (t>3.14159265) {
33.             t-=6.28318531;
34.         }
35.         if (t<0) {
36.             cos=1.27323954*t+0.405284735*t*t;
37.         } else {
38.             cos=1.27323954*t-0.405284735*t*t;
39.         }
40.         var c:Number=sin+cos*cos*cos;
41.         // fast math abs
42.         c=c<0? -c:c;
43.         c=c*140;
44.         // math max 255
45.         c=c>255?255:c;
46.         pix[i]=c<<16|c<<8|c;
47.     }
48.     canvas.setVector(canvas.rect, pix);
49.     canvas.unlock();
50. }

The above snippet will animate a gradient that looks like this:

## QuickBox2D Play

Actionscript:
1. import com.actionsnippet.qbox.*;
2. import Box2D.Common.Math.*;
3.
4. [SWF (backgroundColor=0xaa0000, width=700, height=600)]
5.
6. const TWO_PI:Number = Math.PI * 2;
7.
8. var sim:QuickBox2D = new QuickBox2D(this,{gravityY:20, debug:false});
9.
10. var i:int = 0;
11.
13. var circles:Array = [];
14. var circleNum:int = 20;
15. for (i = 0; i<circleNum; i++){
16.     circles[i] = sim.addCircle({x: 8, y:-2 - i, radius:0.1 + Math.random()*0.4, fillColor:0x000000});
17. }
18.
20. var boxes:Array = [];
21. var boxNum:int = 20;
22. for (i= 0; i<boxNum; i++){
23.     var rx:Number = 4 + (i % 5) * 4;
24.     var ry:Number =  4 + int(i / 5) * 4;
25.     var ra:Number = Math.random() * TWO_PI;
26.     boxes[i] = sim.addBox({x:rx, y:ry, width:3, height:0.4, angle:ra, density:0,fillColor:0xFF2200});
27. }
28.
29. // vector(0,0) used to reset velocity
30. var resetVec:b2Vec2 = new b2Vec2();
31.
32. sim.start();
33. sim.mouseDrag();
34.
36. function onLoop(evt:Event):void {
37.      // rotate all boxes
38.      for (i= 0; i<boxNum; i++){
39.         boxes[i].angle += .05;
40.      }
41.      // move circles to top of sceen after they fall off bottom
42.       for (i= 0; i<circleNum; i++){
43.         if (circles[i].y> 20){
44.             circles[i].y = -1;
45.             circles[i].x = Math.random()*(stage.stageWidth / 30 - 9) + 4;
47.             circles[i].body.SetLinearVelocity(resetVec);
48.         }
49.      }
50. }

This is another QuickBox2D experiment. If you don't know what QuickBox2D is ... read about it here.

Take a look at the swf here

Posted in Box2D, QuickBox2D, motion | Tagged , , | 1 Comment