【问题标题】:Determine original coordinates of corner before rotation确定旋转前角的原始坐标
【发布时间】:2016-04-29 06:04:00
【问题描述】:

我想在一个矩形旋转之前计算矩形左上角的原始坐标。

鉴于我知道矩形已旋转 n 度/弧度,并且我知道新的 xy 坐标,我将如何计算 xy (??) 在 JavaScript 中使用三角函数坐标?我也知道矩形的 widthheight。旋转轴位于矩形的中心。

旋转后的矩形为蓝色,原始矩形为绿色。

【问题讨论】:

    标签: rotation trigonometry transpose


    【解决方案1】:

    您必须围绕枢轴反向旋转它。 (矩形的中心)

    //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));
    

    【讨论】:

      【解决方案2】:

      原来的X转置(“旋转”)Y的距离正好一样,反之亦然,原始 Y 与转置后的 X 距离轴一样远。

      所以:

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

      【讨论】:

      • 抱歉,对我来说有点早。我可以有转置公式吗?即如何从我拥有的信息中获得transXtransY
      • @shennan transX,Y = "newX,Y"
      • origY 似乎无法正确计算。给定一个带有var width = 200, height = 100, axisX = 275, axisY = 200, transX = 325, transY = 47.7; 的矩形,结果origY250,它肯定应该是150origX122.69 上似乎是正确的。我做错了什么?
      • 反转符号:transY - axisY
      • 你的意思是把符号倒过来transX - axisX
      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 2015-12-23
      • 2019-05-09
      • 1970-01-01
      • 2016-01-08
      相关资源
      最近更新 更多