2009-12-19 103 views
1

我发现了计算不同堆栈溢出帖子后向量旋转的边界框宽度和高度的最佳方法。这很好。我现在的问题是计算旋转矢量的边界框的新的x,y坐标。这是我的JavaScript。 newWidth, newHeight变量是正确的 - rotatedXPos, rotatedYPos是不正确的,但是,这是因为x0, y0 - 我认为应该是向量的旋转中间 - 也是不正确的(它们被设置为x,y坐标该向量的右上/左侧,我知道这是错误的)。如何找到旋转的矢量的x,y坐标

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不被在上/左新旋转矢量的计算。我很乐意提供任何帮助,非常感谢!

+0

您可能会在此获得更好的牵引力:http://mathoverflow.net – 2009-12-19 18:14:42

回答

1

如果您知道哪里有椭圆形的中心(XC,YC),那么边框的左上角是

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

(假设+ X顺利,和+ Y下降)。

+0

谢谢先生。这个变化对我有效: var box = this.DiagramNodeVector [0] .getBBox(); this.options.rotatedXPos =(box.x +(box.width)/ 2) - newWidth/2; this.options.rotatedYPos =(box.y +(box.height)/ 2) - newHeight/2; – TimDog 2009-12-19 19:29:57

相关问题