1 var IS_SKV8 = typeof document == "undefined";
2 var HAS_PATH = typeof Path2D != "undefined";
3 var HAS_DISPLAY_LIST = typeof DisplayList != "undefined";
7 var DeltaTheta = Math.PI/90;
8 var FaceColors = ["#000099", "#006600", "#990000", "#EEEE00"];
9 var SideColors = ["#0000FF", "#009900", "#FF0000", "#CCCC00"];
11 function makeGear(pathLike, r) {
12 var dT = Math.PI*2/NumTeeth;
16 pathLike.moveTo(Math.sin(-2*dTq)*outer, Math.cos(-2*dTq)*outer);
17 for (var i=0; i<NumTeeth; i+=2) {
18 pathLike.lineTo(Math.sin(dT*i-dTq)*outer, Math.cos(dT*i-dTq)*outer);
19 pathLike.lineTo(Math.sin(dT*i+dTq)*inner, Math.cos(dT*i+dTq)*inner);
20 pathLike.lineTo(Math.sin(dT*(i+1)-dTq)*inner, Math.cos(dT*(i+1)-dTq)*inner);
21 pathLike.lineTo(Math.sin(dT*(i+1)+dTq)*outer, Math.cos(dT*(i+1)+dTq)*outer);
25 function gearPath(r) {
36 function gearDisplayListStroke(r, color) {
37 if (HAS_DISPLAY_LIST) {
41 var dl = new DisplayList();
42 dl.strokeStyle = color;
51 function gearDisplayListFill(r, color) {
52 if (HAS_DISPLAY_LIST) {
56 var dl = new DisplayList();
66 function strokeGear(ctx, gear) {
68 ctx.stroke(gear.path);
71 makeGear(ctx, gear.r);
77 function fillGear(ctx) {
82 makeGear(ctx, gear.r);
88 function draw3DGear(ctx, angle, gear) {
89 ctx.strokeStyle = gear.sideColor;
90 ctx.fillStyle = gear.faceColor;
92 strokeGear(ctx, gear);
93 for (var i=0; i < 20; i++) {
95 ctx.translate(0.707, 0.707);
97 if (HAS_DISPLAY_LIST) {
98 ctx.draw(gear.gearStroke);
100 strokeGear(ctx, gear);
103 if (HAS_DISPLAY_LIST) {
104 ctx.draw(gear.gearFill);
111 function draw3DGearAt(ctx, angle, gear) {
113 ctx.translate(gear.x, gear.y);
114 draw3DGear(ctx, angle, gear);
118 var onDraw = function() {
123 for (var i=0; i<NumGears; i++) {
124 color = Math.floor(Math.random()*FaceColors.length);
125 r = Math.random()*100+5;
127 x: Math.random()*500,
128 y: Math.random()*500,
130 gearFill: gearDisplayListFill(r, FaceColors[color]),
131 gearStroke: gearDisplayListStroke(r, SideColors[color]),
133 faceColor: FaceColors[color],
134 sideColor: SideColors[color]
139 ctx.resetTransform();
141 ctx.fillStyle = "#FFFFFF";
142 ctx.fillRect(0, 0, 499, 499);
144 rotation += DeltaTheta;
145 if (rotation >= Math.PI*2) {
149 for (var i=0; i < gears.length; i++) {
151 draw3DGearAt(ctx, rotation, gear);
163 setTimeout(fps, 1000);
166 setTimeout(fps, 1000);
172 window.onload = function(){
173 var canvas = document.getElementById("gears");
174 var ctx = canvas.getContext("2d");
175 function drawCallback() {
177 setTimeout(drawCallback, 1);
179 setTimeout(drawCallback, 1);
183 console.log("HAS_PATH: " + HAS_PATH);