【问题标题】:Rotating around an arbitrary point: HTML5 Canvas围绕任意点旋转:HTML5 Canvas
【发布时间】:2012-02-14 17:55:03
【问题描述】:

快来看看神奇的消失矩形吧!

但说真的,我有一个非常简单的 HTML5 画布,它只绘制一个矩形(使用 lineTo 而不是 rect 出于某种原因)。

我的问题:我正在尝试将矩形旋转 90 度。矩形应该旋转 90 度,但它却消失了。

在我的 webapp 项目中,当我在 HTML5 画布中旋转复杂的多边形时,我遇到了奇怪的 x,y 放置错误,因此我创建了这个简单的 HTML 来测试旋转并确保它围绕它的 x,y 点 100,100 旋转。但是,当我尝试旋转形状时,即使这样也会产生奇怪的结果。

谁能告诉我如何让我的矩形可见以及如何在不完全改变 x,y 值的情况下围绕特定点旋转多边形。

有没有人遇到过 HTML5 画布的这个问题并知道解决这个问题的解决方案?

<canvas id="testCanvas" width="900px" height="900px" style="background-color: blue;">

</canvas>
<script type="text/javascript">

    var canvas = document.getElementById("testCanvas");
    var dc     = canvas.getContext("2d");

    dc.clearRect(0, 0, canvas.width, canvas.height);

    dc.save();
    dc.fillStyle = "#FF0000";

    dc.rotate( 90*Math.PI/180 );  // rotate 90 degrees
    dc.beginPath();
    dc.moveTo(100, 100);
    dc.lineTo(200, 100);
    dc.lineTo(200,300);
    dc.lineTo(100,300);
    dc.closePath();
    dc.fill();

    dc.restore();
-->
</script>

【问题讨论】:

标签: javascript html canvas


【解决方案1】:

要围绕一个点旋转,您需要执行 3 个步骤。

  • 首先将上下文转换为您希望旋转的中心。
  • 然后进行实际旋转。
  • 然后将上下文翻译回来。

像这样:

var canvas = document.getElementById("testCanvas");
var dc     = canvas.getContext("2d");
var angle = 0;
window.setInterval(function(){
    angle = (angle + 1) % 360;
    dc.clearRect(0, 0, canvas.width, canvas.height);

    dc.save();
    dc.fillStyle = "#FF0000";

    dc.translate(150,200); // First translate the context to the center you wish to rotate around.
    dc.rotate( angle*Math.PI/180 ); // Then do the actual rotation.
    dc.translate(-150,-200); // Then translate the context back.

    dc.beginPath();
    dc.moveTo(100, 100);
    dc.lineTo(200, 100);
    dc.lineTo(200,300);
    dc.lineTo(100,300);
    dc.closePath();
    dc.fill();

    dc.restore();
}, 5);

【讨论】:

  • 我用一种不相对于新中心绘制的方法编辑了答案。
  • 改变 angle = angle+1 不是有意义吗?到角度 = (角度 + 1) % 360;这有助于避免不可避免的 maxint,即使这个数字非常大。
  • 翻译 x 和 y 参数是否与画布大小有关?
【解决方案2】:

当您旋转画布时,它会从原点 (0, 0) 旋转,因此您的矩形最终会旋转离开屏幕。

查看这个仅旋转 45 度的示例:http://jsfiddle.net/wjLSm/

解决此问题的一种方法是按其宽度和高度/2 平移画布:http://jsfiddle.net/wjLSm/1/(然后 0,0 位于中间——请注意这一点)

【讨论】:

  • 感谢它在屏幕上显示,但它没有绕 x,y 点 100,100 旋转。旋转后的矩形的 x,y 位置为 200,600。有没有办法让它围绕特定点(100,100)旋转?
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多