【问题标题】:Rotating an equilateral triangle with a rotation matrix on canvas在画布上使用旋转矩阵旋转等边三角形
【发布时间】:2015-09-25 21:31:19
【问题描述】:

所以我很确定我在这里对数学的某个地方进行了大量的研究,因为它在纸上检查出来......但是......我的三角形正在从页面上旋转哈哈。我想要做的是永远逆时针旋转一个等边三角形,原点(三角形的中心,即三条线,从每个顶点到中间一条,它们相遇的地方就是我定义三角形中心的方式)不动。所以这是我的数学总结,以防这里有错误:

v1(x1,y1),v2(x2,y2),和v3(x3.y3)代表三角形中的顶点。首先我计算三角形的中心:x=(x1+x2+x3)/3, y=(y1+y2+y3)/3。接下来,我通过从每个顶点中减去中心的值来创建三个新顶点。然后我将每个新顶点乘以旋转矩阵 30 度,并将中心添加到新旋转顶点。

我已尽力阅读并确保它有意义。

这是我的代码:

function calcVerts() {
    var xOrig = (x1 + x2 + x3)/3;
    var yOrig = (y1 + y2 + y3)/3;
    
    x1 -= xOrig;
    x2 -= xOrig;
    x3 -= xOrig;
    y1 -= yOrig;
    y2 -= yOrig;
    y3 -= yOrig; 

    x1 = (x1 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y1);
    y1 = (x1 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y1);
    x2 = (x2 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y2);
    y2 = (x2 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y2);
    x3 = (x3 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y3);
    y3 = (x4 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y3);
    
    x1 += xOrig;
    x2 += xOrig;
    x3 += xOrig;
    y1 += yOrig;
    y2 += yOrig;
    y3 += yOrig; 
}
function drawScreen() {
    context.clearRect(0, 0, context.canvas.width, context.canvas.height); //clear canvas before each repaint
    
    // the triangle
    context.beginPath();
    context.moveTo(x1, y1);
    context.lineTo(x2, y2);
    context.lineTo(x3, y3);
    context.closePath();
    base++;
    // the outline
    context.lineWidth = 10;
    context.strokeStyle = '#666666';
    context.stroke();
    
    calcVerts();
}

theCanvas = document.getElementById("myCanvas");
context = theCanvas.getContext("2d");
var speed = 5;
var base = 400;
var height = 346.4;
var x1 = base-200;
var x2 = base-400;
var x3 = base;
var y1 = height-346.4;
var y2 = height;
var y3 = height;

function drawLoop() {
    window.setTimeout(drawLoop, 500);
    drawScreen();
}
drawLoop();
<div align="center">
    <canvas id="myCanvas" width="500" height="500"></canvas>
</div>

EDIT1: 由于 Jason 发现了错字,我不再旋转页面,而是三角形在每次旋转时都在缩小。编辑:y3 = (x4 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y3);y3 = (x3 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y3);

【问题讨论】:

  • x4 更改为x3 会有所帮助:y3 = (x4 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y3); 但是现在三角形缩小了,所以你遇到了一个新问题。
  • 哈哈好错别字,这意味着我的数学现在搞砸了=D
  • 有一种更简单的方法可以达到预期的效果jsfiddle.net/91mrzubh(使用旋转矩阵可能更容易)。
  • 现在我对自己很失望 Alexey =(, thx haha​​
  • 还可以查看内置矩阵操作函数:developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/… 以下是它们如何应用于您的问题:jsfiddle.net/twja15kd

标签: javascript html


【解决方案1】:

它们工作得很好,但你错过了一点。 (和 x4)。

   x1 = (x1 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y1);
   y1 = (x1 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y1);
   x2 = (x2 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y2);
   y2 = (x2 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y2);
   x3 = (x3 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y3);
   y3 = (x3 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y3);

您更新了x1x2x3 的值,但之后再次使用它。

你必须使用相同的缓冲区,降低你的数学并更新如下值:

var x1_ = (x1 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y1),
    y1_ = (x1 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y1),
    x2_ = (x2 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y2),
    y2_ = (x2 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y2),
    x3_ = (x3 * Math.cos(-(1/6)*Math.PI)) - ((Math.sin(-(1/6)*Math.PI))*y3),
    y3_ = (x3 * Math.sin(-(1/6)*Math.PI)) + ((Math.cos(-(1/6)*Math.PI))*y3);

x1 = x1_;
x2 = x2_;
x3 = x3_;
y1 = y1_;
y2 = y2_;
y3 = y3_;

【讨论】:

  • 我明白你在说什么,但是为什么它从原来的位置开始然后立即移动到左上角,然后完美地旋转到那里?
  • 左上角移动后旋转不完美,旋转但扭曲。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2021-12-04
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多