基于对称pi的html画布翻译

时间:2017-12-30 12:02:33

标签: javascript html5 canvas geometry pi

W3 Schools HTML Canvas Clock drawing tutorial中,时钟数字使用静态乘数(.85在画布上转换,如下所示)。

ctx.translate(0, -radius*0.85);

如果您不想使用硬编码/静态.85值来定位数字,您将如何使用Sin,Cos或其他方法找到正确的位置?

2 个答案:

答案 0 :(得分:0)

我认为这是答案:

function drawNumerals() {
var numerals = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ],
   angle = 0,
   numeralWidth = 0;

numerals.forEach(function(numeral) {
  angle = Math.PI/6 * (numeral-3);
  numeralWidth = context.measureText(numeral).width;
  context.fillText(numeral, 
     canvas.width/2  + Math.cos(angle)*(HAND_RADIUS) - numeralWidth/2,
     canvas.height/2 + Math.sin(angle)*(HAND_RADIUS) + FONT_HEIGHT/3);
});
}

您只需根据需要进行编辑即可。 我在Github Gist Draw circle with clock numbers

上找到了它

答案 1 :(得分:0)

我尝试时似乎可以正确扩展。 您是否正在删除或省略canvas元素上的height属性?



<!DOCTYPE html>
<html>
<body>

<canvas id="canvas"
style="background-color:#333">
</canvas>

<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var radius = canvas.height / 2;
ctx.translate(radius, radius);
radius = radius * 0.90
drawClock();

function drawClock() {
  drawFace(ctx, radius);
  drawNumbers(ctx, radius);
}

function drawFace(ctx, radius) {
  var grad;
  ctx.beginPath();
  ctx.arc(0, 0, radius, 0, 2*Math.PI);
  ctx.fillStyle = 'white';
  ctx.fill();
  grad = ctx.createRadialGradient(0,0,radius*0.95, 0,0,radius*1.05);
  grad.addColorStop(0, '#333');
  grad.addColorStop(0.5, 'white');
  grad.addColorStop(1, '#333');
  ctx.strokeStyle = grad;
  ctx.lineWidth = radius*0.1;
  ctx.stroke();
  ctx.beginPath();
  ctx.arc(0, 0, radius*0.1, 0, 2*Math.PI);
  ctx.fillStyle = '#333';
  ctx.fill();
}

function drawNumbers(ctx, radius) {
  var ang;
  var num;
  ctx.font = radius*0.15 + "px arial";
  ctx.textBaseline="middle";
  ctx.textAlign="center";
  for(num = 1; num < 13; num++){
    ang = num * Math.PI / 6;
    ctx.rotate(ang);
    ctx.translate(0, -radius*0.85);
    ctx.rotate(-ang);
    ctx.fillText(num.toString(), 0, 0);
    ctx.rotate(ang);
    ctx.translate(0, radius*0.85);
    ctx.rotate(-ang);
  }
}
</script>

</body>
</html>
&#13;
&#13;
&#13;

代码根据元素实际尺寸确定时钟应使用的高度。如果你不限制高度和宽度,它将看起来不对。

如果你看到你可以通过修改画布的高度和宽度属性来加倍时钟大小

&#13;
&#13;
<!DOCTYPE html>
<html>
<body>

<canvas id="canvas" height="800px" width="800px"
style="background-color:#333">
</canvas>

<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var radius = canvas.height / 2;
ctx.translate(radius, radius);
radius = radius * 0.90
drawClock();

function drawClock() {
  drawFace(ctx, radius);
  drawNumbers(ctx, radius);
}

function drawFace(ctx, radius) {
  var grad;
  ctx.beginPath();
  ctx.arc(0, 0, radius, 0, 2*Math.PI);
  ctx.fillStyle = 'white';
  ctx.fill();
  grad = ctx.createRadialGradient(0,0,radius*0.95, 0,0,radius*1.05);
  grad.addColorStop(0, '#333');
  grad.addColorStop(0.5, 'white');
  grad.addColorStop(1, '#333');
  ctx.strokeStyle = grad;
  ctx.lineWidth = radius*0.1;
  ctx.stroke();
  ctx.beginPath();
  ctx.arc(0, 0, radius*0.1, 0, 2*Math.PI);
  ctx.fillStyle = '#333';
  ctx.fill();
}

function drawNumbers(ctx, radius) {
  var ang;
  var num;
  ctx.font = radius*0.15 + "px arial";
  ctx.textBaseline="middle";
  ctx.textAlign="center";
  for(num = 1; num < 13; num++){
    ang = num * Math.PI / 6;
    ctx.rotate(ang);
    ctx.translate(0, -radius*0.85);
    ctx.rotate(-ang);
    ctx.fillText(num.toString(), 0, 0);
    ctx.rotate(ang);
    ctx.translate(0, radius*0.85);
    ctx.rotate(-ang);
  }
}
</script>

</body>
</html>
&#13;
&#13;
&#13;