我刚开始使用 <canvas>
数学很差。我在我的 Canvas 上绘制了一个简单的等边三 Angular 形,这个函数借用了别人的代码(不要恨我):
drawTriangle(PosX, PosY, SideLength, Orientation) {
context.beginPath();
var sides = 3;
var a = ((Math.PI * 2) / sides);
context.moveTo(PosX + SideLength, PosY);
for (var i = 1; i < sides + 1; i++) {
context.lineTo(PosX + SideLength * Math.cos(a*i), PosY + SideLength * Math.sin(a*i));
}
context.closePath();
return true;
}
该函数只会知道三 Angular 形的中心坐标和指向它的方向,没有其他信息。
它目前已成功绘制三 Angular 形但“指向”东方。
如何使用 Orientation
旋转三 Angular 形参数(度)而不像其他答案建议的那样旋转整个 Canvas ?
最佳答案
这是一个绘制任意正多边形和指定 Angular 函数:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var sideCount=3;
var size=40;
var centerX=50;
var centerY=50;
var strokeWidth=4;
var strokeColor='purple';
var fillColor='skyblue';
var rotationDegrees=0;
var rotationIncrement=1;
var nextTime=0;
var delay=1000/60*1;
requestAnimationFrame(animate);
function animate(time){
if(time<nextTime){requestAnimationFrame(animate);return;}
nextTime=time+delay;
ctx.clearRect(0,0,cw,ch);
drawPolygon(centerX,centerY,sideCount,size,strokeWidth,strokeColor,fillColor,rotationDegrees);
rotationDegrees+=rotationIncrement;
requestAnimationFrame(animate);
}
function drawPolygon(centerX,centerY,sideCount,size,strokeWidth,strokeColor,fillColor,rotationDegrees){
var radians=rotationDegrees*Math.PI/180;
ctx.translate(centerX,centerY);
ctx.rotate(radians);
ctx.beginPath();
ctx.moveTo (size * Math.cos(0), size * Math.sin(0));
for (var i = 1; i <= sideCount;i += 1) {
ctx.lineTo (size * Math.cos(i * 2 * Math.PI / sideCount), size * Math.sin(i * 2 * Math.PI / sideCount));
}
ctx.closePath();
ctx.fillStyle=fillColor;
ctx.strokeStyle = strokeColor;
ctx.lineWidth = strokeWidth;
ctx.stroke();
ctx.fill();
ctx.rotate(-radians);
ctx.translate(-centerX,-centerY); }
<canvas id="canvas" width=512 height=512></canvas>
<canvas id="canvas" width=512 height=512></canvas>
关于javascript - 如何在不旋转整个 Canvas 的情况下旋转三 Angular 形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38238282/