2009-12-19 5 views
1

J'ai trouvé le meilleur moyen de calculer la largeur et la hauteur de la boîte englobante d'un post-rotation vectorielle à partir d'un poteau de débordement de pile différent. Cela a bien fonctionné. Mon problème maintenant est de calculer les nouvelles coordonnées x, y de la boîte englobante du vecteur pivoté. Voici le mon javascript. Les variables newWidth, newHeight sont correctes - les rotatedXPos, rotatedYPos ne sont pas correctes, cependant, et c'est parce que x0, y0 - ce qui je pense devrait être le milieu de rotation du vecteur - sont également incorrectes (Ils sont réglés sur les coordonnées x, y de la partie supérieure droite/gauche du vecteur, que je sais est faux).Comment trouver les coordonnées x, y d'un vecteur pivoté

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. Dans la vidéo, la boîte rouge indique la newWidth, newHeight correctement, mais le rotatedXPos et rotatedYPos ne sont pas calculés en haut/gauche du vecteur nouvellement tourné. J'adorerais toute aide, merci beaucoup!

+0

Vous pourriez obtenir une meilleure traction ici: http://mathoverflow.net –

Répondre

1

Si vous savez où le centre de l'ellipse est (xc, YC), puis le coin supérieur gauche de la zone de délimitation est

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

(en supposant + x + va à droite et y descend).

+0

Merci monsieur. Une variation de ceci a fonctionné pour moi: 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

Questions connexes