javascript - 旋转 HTML Canvas 中的点

标签 javascript canvas vector rotation transformation

我正在尝试学习一些基本的向量数学,但我似乎无法让这种旋转点的方法发挥作用。旋转矢量的大小正在按比例放大,我不知道 Angular 是怎么回事。

这是相关的函数。我正在使用 javascript/HTML Canvas 。

function rotate(point, center, angle) {
  var theta = (Math.PI / 180) * angle,
      cX = center.pos.x,
      cY = center.pos.y,
      pX = point.pos.x,
      pY = point.pos.y,
      pCos = Math.cos(theta),
      pSin = Math.sin(theta),
      x = pX - cX,
      y = pY - cY;
  x = (x * pCos - y * pSin) + cX;
  y = (x * pSin + y * pCos) + cY;
  return {x: Math.floor(x), y: Math.floor(y)};
}

这是一个jsbin of the weird result

最佳答案

该函数几乎是正确的,但您只是使用修改后的 x 值来计算 y

function rotate(point, center, angle) {
  var theta = (Math.PI / 180) * angle,
      cX = center.pos.x,
      cY = center.pos.y,
      pX = point.pos.x,
      pY = point.pos.y,
      pCos = Math.cos(theta),
      pSin = Math.sin(theta),
      x = pX - cX,
      y = pY - cY;
  /* You had
  x = (x * pCos - y * pSin) + cX; // you change x on this line
  y = (x * pSin + y * pCos) + cY; /// then used the modified x to get y
  */
  // this will fix the problem
  var xx = (x * pCos - y * pSin) + cX;
  var yy = (x * pSin + y * pCos) + cY;
  return {x: Math.floor(xx), y: Math.floor(yy)};
}

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

相关文章:

javascript - Backbone 重新排序了一个集合,以便家始终是第一位的?

javascript - 从对象数组中获取最后一个匹配的键来检查值

c++ - 读取数字到 vector

c++ - 为什么 std::accumulate 函数显示 vector <double> 的错误总和?

javascript - dygraph - 如何更改条形图的系列名称

javascript - 如果使用 JavaScript 或 jQuery 检查了相同 ID 的任何复选框,如何启用按钮

javascript - Javascript Canvas 游戏的边界

javascript - HTML5 Canvas Base64 错误

javascript - 自上而下的 RPG 式基于网格的滚动的最佳技术?

c++ - 在 C++ 中搜索按字典顺序排序的 vector<vector <int>>