代码之家  ›  专栏  ›  技术社区  ›  TimDog

如何求旋转向量的x,y坐标

  •  1
  • TimDog  · 技术社区  · 16 年前

    我找到了从不同的堆栈溢出柱计算向量柱旋转的边界框的宽度和高度的最佳方法。这很有效。我现在的问题是计算旋转向量边界框的新x,y坐标。这是我的javascript代码。这个 newWidth, newHeight 变量是正确的 rotatedXPos, rotatedYPos 然而,这是不正确的,因为 x0, y0

    this.options.rotationAngle = parseInt(this.options.lastRotationAngle);
    var degreesAsRadians = this.options.rotationAngle*Math.PI/180;
    var points = new Array();
    points.push({x:0, y:0});
    points.push({x:this.options.width, y:0});
    points.push({x:0, y:this.options.height});
    points.push({x:this.options.width, y:this.options.height});
    var bb = new Array();
    bb['left'] = 0; bb['right'] = 0; bb['top'] = 0; bb['bottom'] = 0;
    
    $A(points).each(function(p) {
      var newX = Math.abs(parseInt(p.x * Math.cos(degreesAsRadians) + p.y *  Math.sin(degreesAsRadians)));
      var newY = Math.abs(parseInt(p.x * Math.sin(degreesAsRadians) + p.y * Math.cos(degreesAsRadians)));
      bb['left'] = Math.min(bb['left'], newX);
      bb['right'] = Math.max(bb['right'], newX);
      bb['top'] = Math.min(bb['top'], newY);
      bb['bottom'] = Math.max(bb['bottom'], newY); 
    });
    
    var newWidth = parseInt(Math.abs(bb['right'] - bb['left']));
    var newHeight = parseInt(Math.abs(bb['bottom'] - bb['top']));
    
    Object.extend(this.options, {
    rotatedWidth: newWidth
    ,rotatedHeight: newHeight 
    });
    
    var x0 = this.options.xPos;
    var y0 = this.options.yPos;
    
    this.options.rotatedXPos = x0+(this.options.xPos-x0)*Math.cos(degreesAsRadians)+(this.options.yPos-y0)*Math.sin(degreesAsRadians);
    this.options.rotatedYPos = y0-(this.options.xPos-x0)*Math.sin(degreesAsRadians)+(this.options.yPos-y0)*Math.cos(degreesAsRadians);
    

    And here is a video. 在视频中,红色框正确显示newWidth和newHeight,但 rotatedXPos rotatedYPos 未在新旋转的向量的顶部/左侧计算。我想得到任何帮助,谢谢!

    1 回复  |  直到 16 年前
        1
  •  1
  •   John    16 年前

    如果知道椭圆中心的位置(xc,yc),则边界框的左上角为

    (xc - newWidth/2, yc - newHeight/2)