javascript - Canvas - 旋转线

标签 javascript html canvas

我是 Canvas 新手,我需要做一些在 google 上找不到答案的事情...

假设我有一 strip 有起点和终点的线。 我需要围绕起点旋转这条线。

这是 jsfiddle : http://jsfiddle.net/0cc6h833/1/

var cd;
var ctx2;
var startPoint;
var endPoint;
        function init(){
            cd= document.getElementById("canvas2");
            cd.width=500;
            cd.height=500;

            ctx2=cd.getContext("2d");
        }


        function draw(){
            startPoint={ x:200, y:200};
            endPoint={ x:startPoint.x+100, y:startPoint.y+100};

            ctx2.beginPath();
                ctx2.setLineDash([1,2]);
                ctx2.moveTo(startPoint.x,startPoint.y);
                ctx2.lineTo(endPoint.x,endPoint.y);
                ctx2.stroke();
                ctx2.closePath();            
        }

init();
draw();

我也愿意使用任何 Canvas 库。 我知道这样会更简单,但我不知道该选择哪一个

最佳答案

您可以使用变换来旋转绘制到 Canvas 上的线条或任何形状。旋转:

  • 转换为枢轴点,即。旋转点
  • 应用旋转变换
  • 翻译回来
  • 绘制形状

在你的情况下,如果我们说绕线的中间旋转:

var cd;
var ctx2;
var startPoint;
var endPoint;
var midPoint;

function init() {
  cd = document.getElementById("canvas2");
  cd.width = 500;
  cd.height = 500;

  ctx2 = cd.getContext("2d");
}


function draw() {
  startPoint = {
    x: 200,
    y: 200
  };
  endPoint = {
    x: startPoint.x + 100,
    y: startPoint.y + 100
  };

  ctx2.beginPath();
  ctx2.setLineDash([1, 2]);
  
  // rotate around center - find mid-point using lerp
  midPoint = {
    x: startPoint.x + (endPoint.x - startPoint.x) * 0.5,
    y: startPoint.y + (endPoint.y - startPoint.y) * 0.5
  };
  
  // translate to midpoint
  ctx2.translate(midPoint.x, midPoint.y);
  
  // rotate some angle (radians)
  ctx2.rotate(0.25 * Math.PI);  // = 45°
  
  // translate back
  ctx2.translate(-midPoint.x, -midPoint.y);

  // draw line
  ctx2.moveTo(startPoint.x, startPoint.y);
  ctx2.lineTo(endPoint.x, endPoint.y);
  ctx2.stroke();
  ctx2.closePath();
  
  // reset transforms
  ctx2.setTransform(1,0,0,1,0,0);
}

init();
draw();
<canvas id="canvas2" width="500" height="500" style="border:1px solid #000000;">
</canvas>

话虽这么说,如果您需要与线条进行交互,那么转换可能会显得令人困惑,因为鼠标位置不会反转转换,并且最终会出现与您预期不同的位置。

因此,您可以使用手动转换,以便了解转换后线条末端的确切位置(使用您在原始位置上操作的内置转换)。

为此,请参阅 this answer 获取该部分的方法。

关于javascript - Canvas - 旋转线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704401/

相关文章:

javascript - jarallax 库不起作用

html - 如何在 HTML5 Canvas 中创建可拖动的线?

javascript - 使用javascript创建具有随机颜色的随机矩形而不重叠

javascript - AngularJS - 立即应用指令,格式化货币

html - Bootstrap 卡片中的左对齐按钮

javascript - 如何使 Material ui 选项卡只对特定的 url 有效

javascript - 为什么显示的是 [object HTMLCollection] 而不是我创建的元素?

jquery - 有 RoR 或 JQuery 的绘图插件吗?

javascript - 将对象内的两个属性相乘

Javascript:onclick函数获取元素