我有以下代码在单击按钮时在HTML5画布上绘制任何多边形。用户提供半径,边,x和y坐标。使用边应绘制任何正多边形。首先,我们使用moveTo()移动到周边,然后根据边使用lineTo()绘制线条。
js.js
function drawPolygon() {
var numberOfSides = prompt("Enter number of sides");
var Xcenter = prompt("Enter x");
var Ycenter = prompt("Enter y");
var size = prompt("Enter radius");
var con=document.getElementById("myCanvas");
var cxt=con.getContext("2d");
cxt.beginPath();
cxt.moveTo (Xcenter + size * Math.cos(0), Ycenter + size * Math.sin(0));
for (var i = 1; i <= numberOfSides;i += 1) {
cxt.lineTo (Xcenter + size * Math.cos(i * 2 * Math.PI / numberOfSides), Ycenter + size * Math.sin(i * 2 * Math.PI / numberOfSides));
}
cxt.strokeStyle = "#000000";
cxt.lineWidth = 1;
cxt.stroke();
}
function registerEvents(){
var poly = document.getElementById("polygon");
poly.addEventListener( "click", drawPolygon, false);
}
window.addEventListener('load', registerEvents, false);
提供输入后,画布上不会绘制任何内容。我的代码是错误的吗?
答案 0 :(得分:3)
您的数学错误是因为您没有将输入转换为数值。
e.g。除非Ycenter + size * Math.sin(0)
和Ycenter
是数值,否则size
将无法返回正确的结果。
你应该做这样的事情:
var Xcenter = parseFloat(prompt("Enter x"));
var Ycenter = parseFloat(prompt("Enter y"));
var size = parseFloat(prompt("Enter radius"));
答案 1 :(得分:0)
这是一个甚至支持顺时针/逆时针绘图的功能,您可以使用非零缠绕规则控制填充。
Here is a full article on how it works and more.
// Defines a path for any regular polygon with the specified number of sides and radius,
// centered on the provide x and y coordinates.
// optional parameters: startAngle and anticlockwise
function polygon(ctx, x, y, radius, sides, startAngle, anticlockwise) {
if (sides < 3) return;
var a = (Math.PI * 2)/sides;
a = anticlockwise?-a:a;
ctx.save();
ctx.translate(x,y);
ctx.rotate(startAngle);
ctx.moveTo(radius,0);
for (var i = 1; i < sides; i++) {
ctx.lineTo(radius*Math.cos(a*i),radius*Math.sin(a*i));
}
ctx.closePath();
ctx.restore();
}
// Example using the function.
// Define a path in the shape of a pentagon and then fill and stroke it.
context.beginPath();
polygon(context,125,125,100,5,-Math.PI/2);
context.fillStyle="rgba(227,11,93,0.75)";
context.fill();
context.stroke();