围绕原点

时间:2016-10-07 06:23:11

标签: javascript math typescript rotation

我试图围绕原点旋转4点。当我不旋转点时,它们会显示在正确的位置。我是这样做的:

let origin = this.transform.position;
for (let i in this._pointsOrig) {
    let point = this._pointsOrig[i];
    this._points[i] = new Vector2(
        point.x + origin.x,
        point.y + origin.y
    );
}

这给了我这个结果:

注意:蓝色十字是原点,绿色矩形勾勒出点

Collider not rotated

当我尝试旋转矩形时,如下所示:

// degrees is between 0 & 360, so convert to radians
let rotation = this.transform.rotation.degrees * (Math.PI / 180);
let cos = Math.cos(rotation);
let sin = Math.sin(rotation);
let origin = this.transform.position;

for (let i in this._pointsOrig) {
    let point = this._pointsOrig[i];
    this._points[i] = new Vector2(
        (cos * (point.x - origin.x)) + (sin * (point.y - origin.y)) + origin.x,
        (cos * (point.y - origin.y)) - (sin * (point.x - origin.x)) + origin.y
    );
}

我得到这个结果,矩形现在在左下角。

Collider Rotated

我不确定我需要做什么,所以这些点围绕原点旋转。

2 个答案:

答案 0 :(得分:2)

我会尝试使用

(cos * point.x) + (sin * point.y) + origin.x,
(cos * point.y) - (sin * point.x) + origin.y

看起来像point.x和point.y是转移之前的值(origin.x,origin.y)。因此,在旋转之前移动坐标具有不期望的效果。

您可能会发现旋转方向错误

(cos * point.x) - (sin * point.y) + origin.x,
(cos * point.y) + (sin * point.x) + origin.y

如此改变的迹象可行。

如果旋转总是90°我们知道比cos(90°)= 0,sin(90°)= 1所以它简化为

this.points[i] = new Vector2(
    - point.y + origin.x,
      point.x + origin.y );

如果问题仍然存在,可能有助于为origin_pointsOrig[i]和结果添加一些实际值。

答案 1 :(得分:0)

您必须在旋转前移动_pointsOrig,使它们以坐标原点为中心。

然后旋转,然后按原点移动

point.x  = point.x - left + width / 2
point.y  = point.y - top + height / 2
this._points[i] = new Vector2(
    (cos * point.x + sin * point.y) + origin.x,
    (cos * point.y - sin * point.x) + origin.y