What am I missing? The drawCircle and DrawPolygon (it is located in codepen https://codepen.io/mancod/pen/oNYdrVL work fine. I am still very new to all this still, and beat myself up as nothing in life should be this messy. A star is a circle as is a polygon. I get that the star has an inner and outer radius, but I cannot get this star. Thank you in advance for eyes that can fill in the part I am missing or have in the wrong order for function drawStar(). I have commented out the drawline and drawcircle. If you want to know it that even work you can view it on https://jsfiddle.net/mancod/mhbrqxk8/45/ where I have commented out the drawStar.
`enter code here`var canvas, context, dragging = false, dragStartLocation, snapshot; `enter code here`function getCanvasCoordinates(event) { var x = event.clientX - canvas.getBoundingClientRect().left, y = event.clientY - canvas.getBoundingClientRect().top; return {x: x, y: y}; } `enter code here`function takeSnapshot (){ snapshot = context.getImageData(0, 0, canvas.width, canvas.height); } `enter code here`function restoreSnapshot() { context.putImageData(snapshot, 0, 0); } `enter code here`function drawLine(position) { context.beginPath(); context.moveTo(dragStartLocation.x, dragStartLocation.y); context.lineTo(position.x, position.y); context.stroke(); } `enter code here`// this is for making circles //d(P, Q) = p(x2 − x1)2 + (y2 − y1)2 {Distance formula} //https://orion.math.iastate.edu/dept/links/formulas/form2.pdf // comment out function to go back to drawing just straight lines. function drawCircle (position) { var radius = Math.sqrt(Math.pow((dragStartLocation.x - position.x), 2) + Math.pow((dragStartLocation.y - position.y), 2)); context.beginPath(); context.arc(position.x, position.y, radius, 0, 2 * Math.PI, false); context.fill(); } **function drawStar (position, points, outerRadius, innnerRadius) { var coordinates=[], radius = index%2 == 0? outerRadius : innerRadius, index=0; for (index = 0; index < points; index++) { coordinates.push({x: dragStartLocation.x + radius * Math.cos(angle), y: dragStartLocation.y - radius * Math.sin(angle)}); angle += Math.PI / points; context.beginPath(); context.drawStar(position, points, innerRadius, outerRadius); context.moveTo(coordinates[0].x, coordinates[0].y+outerRadius); //for (index = 1; index < points; index++) //{ //context.lineTo(coordinates[index].x + radius *Math.cos(angle), coordinates[index].y + radius * Math.sin(angle)); //} } context.closePath(); }** function dragStart(event) { dragging = true; dragStartLocation = getCanvasCoordinates(event); takeSnapshot(); } function drag(event) { var position; if (dragging === true) { restoreSnapshot(); position = getCanvasCoordinates(event); //to not see the radius line just reverse the order of the two below //drawCircle(position); //drawLine(position); drawStar(position, 6, 2, 15); } } function dragStop(event) { dragging = false; restoreSnapshot(); var position = getCanvasCoordinates(event); //to not see the radius line just reverse the order of the two below //drawCircle(position); //drawLine(position); drawStar(postion,6, 2,15); } canvas = document.getElementById("cv0"); context = canvas.getContext('2d'); context.strokeStyle = 'orange'; context.fillStyle = 'hsl(' + 360*Math.random() +', 100%, 45%)'; context.lineWidth = 5; canvas.addEventListener('mousedown', dragStart, false); canvas.addEventListener('mousemove', drag, false); canvas.addEventListener('mouseup', dragStop, false);
Advertisement
Answer
Let’s have a look at the parameter definition for the drawStar() function:
drawStar (position, points, outerRadius, innnerRadius)
and remind ourselves what a typical stylized star looks like
Alright so far. There are two places the drawStar function gets called: inside draw
and dragStop
. In both cases you’re calling it like
drawStar(position, 6, 2, 15);
This means we pass 6 as the number of points for the star shape – if we look above we can see that star is made up of 10 points. The second mistake here is the hardcoded values 2 and 15 for the radius of the star. I think you want to dynamically size it according to the movement of the mouse, so we need to recalculate the radii on mouse move. Well as we don’t have a use for the two parameters we can get rid of it altogether and just call it like:
drawStar(position, 10);
Inside the drawStar function we need to calculate the points for the star shape like:
for (index = 0; index < points; index++) { if (index % 2 == 0) { radius = Math.sqrt(Math.pow((dragStartLocation.x - position.x), 2) + Math.pow((dragStartLocation.y - position.y), 2)); } else { radius = Math.sqrt(Math.pow((dragStartLocation.x - position.x), 2) + Math.pow((dragStartLocation.y - position.y), 2)) * 0.5; } coordinates.push({ x: dragStartLocation.x + radius * Math.cos(angle), y: dragStartLocation.y - radius * Math.sin(angle) }); angle += Math.PI / points * 2; }
As you can see where dynamically calculating the radius for the inner and outer points, pushing the points into the coordinates
array and ultimately adding 36° to the angle
variable (360°/10 points=36°)
Finally let’s iterate over the coordinates array and draw the lines to screen:
context.beginPath(); context.moveTo(coordinates[0].x, coordinates[0].y); for (index = 1; index < points; index++) { context.lineTo(coordinates[index].x, coordinates[index].y); } context.closePath(); context.fill();
Here’s a working example based on your fiddle:
var canvas, context, dragging = false, dragStartLocation, snapshot; function getCanvasCoordinates(event) { var x = event.clientX - canvas.getBoundingClientRect().left, y = event.clientY - canvas.getBoundingClientRect().top; return { x: x, y: y }; } function takeSnapshot() { snapshot = context.getImageData(0, 0, canvas.width, canvas.height); } function restoreSnapshot() { context.putImageData(snapshot, 0, 0); } function drawLine(position) { context.beginPath(); context.moveTo(dragStartLocation.x, dragStartLocation.y); context.lineTo(position.x, position.y); context.stroke(); } // this is for making circles //d(P, Q) = p(x2 − x1)2 + (y2 − y1)2 {Distance formula} //https://orion.math.iastate.edu/dept/links/formulas/form2.pdf // comment out function to go back to drawing just straight lines. function drawCircle(position) { var radius = Math.sqrt(Math.pow((dragStartLocation.x - position.x), 2) + Math.pow((dragStartLocation.y - position.y), 2)); context.beginPath(); context.arc(position.x, position.y, radius, 0, 2 * Math.PI, false); context.fill(); } function drawStar(position, points) { var coordinates = []; var index; var radius; var angle = Math.PI / 2; for (index = 0; index < points; index++) { if (index % 2 == 0) { radius = Math.sqrt(Math.pow((dragStartLocation.x - position.x), 2) + Math.pow((dragStartLocation.y - position.y), 2)); } else { radius = Math.sqrt(Math.pow((dragStartLocation.x - position.x), 2) + Math.pow((dragStartLocation.y - position.y), 2)) * 0.5; } coordinates.push({ x: dragStartLocation.x + radius * Math.cos(angle), y: dragStartLocation.y - radius * Math.sin(angle) }); angle += Math.PI / points * 2; } context.beginPath(); context.moveTo(coordinates[0].x, coordinates[0].y); for (index = 1; index < points; index++) { context.lineTo(coordinates[index].x, coordinates[index].y); } context.closePath(); context.fill(); } function dragStart(event) { dragging = true; dragStartLocation = getCanvasCoordinates(event); takeSnapshot(); } function drag(event) { var position; if (dragging === true) { restoreSnapshot(); position = getCanvasCoordinates(event); //to not see the radius line just reverse the order of the two below // drawCircle(position); //drawLine(position); drawStar(position, 10); } } function dragStop(event) { dragging = false; restoreSnapshot(); var position = getCanvasCoordinates(event); //to not see the radius line just reverse the order of the two below // drawCircle(position); //drawLine(position); drawStar(position, 10); } canvas = document.getElementById("cv0"); context = canvas.getContext('2d'); context.strokeStyle = 'orange'; context.fillStyle = 'hsl(' + 360 * Math.random() + ', 100%, 45%)'; context.lineWidth = 5; canvas.addEventListener('mousedown', dragStart, false); canvas.addEventListener('mousemove', drag, false); canvas.addEventListener('mouseup', dragStop, false);
#cv0 { border: solid gray; }
<canvas id='cv0' width=400 height=300></canvas>