2016-04-29 36 views
0

我正在嘗試計算旋轉之前矩形頂部左角的原始座標。在旋轉之前確定拐角的原始座標

既然我知道矩形下旋轉ň度/弧度,並且我知道新Xÿ座標,我將如何計算Xÿ)座標使用JavaScript中的三角函數?我也知道寬度高度的矩形。旋轉的軸是矩形的中心。

example problem

的旋轉矩形是藍色的,原來是綠色。

回答

0

原始X是完全一樣的遠離軸爲換位(「旋轉」)Ý是,反之亦然,原ÿ是儘可能的轉置X是從軸。

所以:

origX = axisX - (axisY - transY
origY = axisY - (axisX - transX

+0

道歉,這一點在上午我早。我可以有換位公式嗎?即如何從我擁有的信息中獲得'transX'和'transY'? – shennan

+0

@shennan * transX,Y * =「* newX,Y *」 – Amit

+0

「origY」似乎沒有正確計算。給定一個矩形,其中var width = 200,height = 100,axisX = 275,axisY = 200,transX = 325,transY = 47.7;'最後'origY'是'250',它肯定應該是'150'? 'origX'在'122.69'似乎是正確的。我究竟做錯了什麼? – shennan

0

你必須圍繞樞軸反向旋轉它。 (該矩形的中心)

//utils 
function nr(v){ return +v || 0 } 

class Point{ 
    constructor(x,y){ 
     this.x = nr(x); 
     this.y = nr(y); 
    } 

    add(pt){ 
     var a = this, b = Point.from(pt); 
     return new Point(a.x + b.x, a.y + b.y); 
    } 

    subtract(pt){ 
     var a = this, b = Point.from(pt); 
     return new Point(a.x - b.x, a.y - b.y); 
    } 

    rotate(radians, pivot){ 
     if(pivot){ 
      return this.subtract(pivot).rotate(radians).add(pivot);    
     } 

     var r = nr(radians), c = Math.cos(r), s = Math.sin(r); 
     return new Point(
      this.x * c - this.y * s, 
      this.x * s + this.x * c 
     ); 
     //return delta.matrixTransform(c, s, -s, c); 
    } 

    matrixTransform(a, b, c, d, tx, ty){ 
     return new Point(
      this.x * nr(a) + this.y * nr(c) + nr(tx), 
      this.x * nr(b) + this.y * nr(d) + nr(ty) 
     ) 
    } 

    static from(pt){ 
     if(pt instanceof Point) return pt; 
     return new Point(pt && pt.x, pt && pt.y); 
    } 
} 

和計算:

var RAD = Math.PI/180, DEG = 180/Math.PI; 

var knownPoint = new Point(100, 100); 
var angle = 30*RAD; 

var unrotatedRect = { width: 150, height: 100 }; 
//the pivot to (counter-)rotate your known point 
//if you know this point, you don't have to compute it 
var pivot = new Point(unrotatedRect.width/2, unrotatedRect.height/2) 
    .rotate(angle) 
    .add(knownPoint); 

console.log(knownPoint.rotate(-angle, pivot));