4

因此,如果这是我用来在画布上绘制圆圈的代码:

ctx.beginPath();
ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
ctx.lineWidth = 3;
ctx.strokeStyle = "black";
ctx.stroke();

...我怎样才能获得组成这个圆的点的坐标数组,以便我可以将它们保存在数据库中并稍后使用 context.moveTo() 和 context.lineTo() 方法加载到画布上以连接点,画同一个圆圈?

我想我是在问是否可以使用不是 .arc() 方法而是通过用线连接点来绘制这种圆,如果我只知道我的中心坐标和圆半径(当然还有线的宽度和颜色)。这应该使我能够在循环时将每个点坐标保存在一个数组中。

4

2 回答 2

6

@Octopus 是在正确的轨道上:

var centerX=100;
var centerY=100;
var radius=40;

// an array to save your points
var points=[];

for(var degree=0;degree<360;degree++){
    var radians = degree * Math.PI/180;
    var x = centerX + radius * Math.cos(radians);
    var y = centerY + radius * Math.sin(radians);
    points.push({x:x,y:y});
}

然后您可以使用点数组中的点对象绘制圆:

ctx.beginPath();
ctx.moveTo(points[0].x,points[0].y);
for(var i=1;i<points.length;i++){
    ctx.lineTo(points[i].x,points[i].y);
}
ctx.closePath();
ctx.fillStyle="skyblue";
ctx.fill();
ctx.strokeStyle="lightgray";
ctx.lineWidth=3;
ctx.stroke()

一个建议,但是...

无需将所有点保存在数据库中,只需将 centerX/Y 和半径保存在数据库中即可。

然后,您可以使用相同的数学来创建点并绘制圆。

于 2013-08-20T18:51:57.383 回答
1

您正在询问一个圆圈的公式,即:

radius*radius = (x-centerX)*(x-centerX) + (y-centerY)*(y-centerY)

或者,如果您想生成n个点,请执行以下操作:

for (i=0;i<n;i++) {
    x[i] = centerX + radius* Math.cos( (i*2*Math.PI)/n );
    y[i] = centerY + radius*-Math.sin( (i*2*Math.PI)/n );
}
于 2013-08-20T18:32:23.617 回答