JSFiddle - React, Tailwind, and code Playground

by Francisco Guerra

HTML

<center><button onclick="doDrawing();">Start Drawing</button>
</center>
<center><canvas id="myCanvas" width="600" height="600" style="border:3px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas></center>

JavaScript

var t = 0;
var c = document.getElementById("myCanvas");
var R = 100;
var r = 75;
var ctx = c.getContext("2d");
var O = 90;


function doDrawing() {
    t = 0;

     
    // Clear the Canvas
    ctx.clear();
    
    // Create a random color
    var timesRun = 0;
    var color =  '#'+Math.floor(Math.random()*16777215).toString(16);
    
    // Initial x and y
    //var x = R+R*Math.cos(0);
    //var y = R+R*Math.sin(0);
  var x = (R+r)*Math.cos(t) - (r+O)*Math.cos(((R+r)/r)*t)+(c.width/2);

	var y = (R+r)*Math.sin(t) - (r+O)*Math.sin(((R+r)/r)*t)+(c.width/2);
    
    
    
    // Start the Drawing
    ctx.beginPath();
    ctx.strokeStyle = color;
    ctx.moveTo(x,y);
      
    //Use the timer to create drawing
    var interval = setInterval(function(){
    timesRun += 1;
    if(timesRun === 600){
        clearInterval(interval); }
        
    drawCircle();}, 10); 
    
}
function drawCircle()
{
  t += .25;
//x = Math.floor(R+R*Math.cos(t));
 // y = Math.floor(R+R*Math.sin(t));
    x = ((R+r)*Math.cos(t)-(r+O)*Math.cos(((R+r)/r)*t)+(c.width/2));

	y = ((R+r)*Math.sin(t)-(r+O)*Math.sin(((R+r)/r)*t)+(c.width/2));

  ctx.lineTo(x,y);  
  ctx.stroke();
}

CanvasRenderingContext2D.prototype.clear = 
  CanvasRenderingContext2D.prototype.clear || function (preserveTransform) {
    if (preserveTransform) {
      this.save();
      this.setTransform(1, 0, 0, 1, 0, 0);
    }

    this.clearRect(0, 0, this.canvas.width, this.canvas.height);

    if (preserveTransform) {
      this.restore();
    }           
};