| <!DOCTYPE html> |
| <html> |
| <head></head> |
| <body> |
| <canvas id="mycanvas" width="300" height="300"></canvas> |
| <script> |
| function rad2deg(x) { |
| return x * 180 / Math.PI; |
| } |
| |
| function ellipseUsingArc(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) |
| { |
| var transform = new WebKitCSSMatrix(); |
| transform = transform.translate(x, y); |
| transform = transform.rotate(rad2deg(rotation)); |
| transform = transform.scale(radiusX, radiusY); |
| |
| /* |
| Use WebKitCSSMatrix instead of as follows, because using WebKitCSSMatrix computes float values more precisely. |
| It is because we don't want to fail pixel comparison due to float precision. |
| context.translate(x, y); |
| context.rotate(rotation); |
| context.scale(radiusX, radiusY); |
| */ |
| context.save(); |
| context.transform(transform.a, transform.b, transform.c, transform.d, transform.e, transform.f); |
| context.arc(0, 0, 1, startAngle, endAngle, anticlockwise); |
| context.restore(); |
| } |
| |
| var canvas = document.getElementById('mycanvas'); |
| var ctx = canvas.getContext('2d'); |
| |
| ctx.fillStyle = '#0f0'; |
| ctx.fillRect(0, 0, canvas.width, canvas.height); |
| ctx.lineJoin = 'bevel'; |
| ctx.lineWidth = 12; |
| ctx.beginPath(); |
| ellipseUsingArc(ctx, 200, 150, 40, 80, -Math.PI / 6, Math.PI / 2, -Math.PI / 2, false); |
| ellipseUsingArc(ctx, 100, 150, 40, 80, Math.PI / 6, Math.PI / 2, -Math.PI / 2, false); |
| ctx.stroke(); |
| </script> |
| </body> |
| </html> |