5

使用 HTML5 Canvas 和 Javascript,我需要在一个圆圈内以不同的角度显示不同的值(可能由一个点表示)。

示例数据:
val 34% @ 0°、
val 54% @ 12°、
val 23% @ 70°,
等等...

如果我有一个 300 x 300 像素的画布,圆的中心位于 x: 150 像素和 y: 150 像素,半径为 150 像素,我将如何计算将值设置为 12 度 54% 的点的位置?

我的数学有点糟糕xD

我将不胜感激任何帮助,如果我不够清楚,请提出问题。

感谢您的收听,并提前感谢您的深刻见解:D

编辑(更详细地解释):

这是一张图片来说明我要完成的工作: 插图:不同角度/度数的值

我希望这能让我的问题更容易理解。
(如您所见,与上面的值不同)

泰你的耐心!

4

2 回答 2

6

您可以使用它来将极坐标(半径、角度)坐标转换为笛卡尔坐标:

// θ : angle in [0, 2π[
function polarToCartesian(r, θ) {
    return {x: r*Math.cos(θ), y: r*Math.sin(θ)};
}

例如,如果您想在 12° 处绘制,您可以这样计算点:

var p = polarToCartesian(150, 12*2*Math.PI/360);
p.x += 150; p.y += 150;

编辑:我的polarToCartesian函数将弧度作为输入,与 Canvas API 中的函数一样多。如果你更习惯学位,你可能需要这个:

 function degreesToRadians(a) {
     return Math.PI*a/180;
 }
于 2012-09-20T12:09:14.007 回答
1

给你(演示

var can = document.getElementById('mycanvas');
var ctx = can.getContext('2d');

var drawAngledLine = function(x, y, length, angle) {
    var radians = angle / 180 * Math.PI;
    var endX = x + length * Math.cos(radians);
    var endY = y - length * Math.sin(radians);

    ctx.beginPath();
    ctx.moveTo(x, y)
    ctx.lineTo(endX, endY);
    ctx.closePath();
    ctx.stroke();
}

var drawCircle = function(x, y, r) {
    ctx.beginPath();
    ctx.arc(x, y, r, 0, Math.PI*2, true);
    ctx.closePath();
    ctx.fill();
}

var drawDot = function(x, y, length, angle, value) {
    var radians = angle / 180 * Math.PI;
    var endX = x + length*value/100 * Math.cos(radians);
    var endY = y - length*value/100 * Math.sin(radians);
    drawCircle(endX, endY, 2);
}

var drawText = function(x, y, length, angle, value) {
    var radians = angle / 180 * Math.PI;
    var endX = x + length*value/100 * Math.cos(radians);
    var endY = y - length*value/100 * Math.sin(radians);
    console.debug(endX+","+endY);
    ctx.fillText(value+"%", endX+15, endY+5);
    ctx.stroke();
}

var visualizeData = function(x, y, length, angle, value) {

    ctx.strokeStyle = "#999";
    ctx.lineWidth = "1";
    drawAngledLine(x, y, length, angle);

    ctx.fillStyle = "#0a0";
    drawDot(x, y, length, angle, value);

    ctx.fillStyle = "#666";
    ctx.font = "bold 10px Arial";
    ctx.textAlign = "center";
    drawText(x, y, length, angle, value);
}

ctx.fillStyle = "#FFF0B3";
drawCircle(150, 150, 150);

visualizeData(150, 150, 150, 0, 34);
visualizeData(150, 150, 150, 12, 54);
visualizeData(150, 150, 150, 70, 23)

visualizeData(150, 150, 150, 120, 50);
visualizeData(150, 150, 150, -120, 80);
visualizeData(150, 150, 150, -45, 60);
于 2012-09-27T04:24:51.360 回答