¿Centro geométrico en AS3?
4 seguidores
Hola, tengo una imagen muy grande que necesito escalar. Esta imagen esta dentro de un contenedor con barras de scroll. El problema es que cuando la escalo, esta se escala desde su "origen" ya sea este el centro de la imagen o la esquina superior izquierda.
¿Como puedo hacer que la imagen se escale desde el centro del contenedor?
Alguien me dijo que tenía que buscar el centro geométrico pero no se como hacerlo :(
Saludos!
tpmmds
Hola:
Anidándola. Te creas un sprite en la posición que quieres que sea el origen del cambio de escala (el origen de la homotecia, que diría un profe de dibujo), en este caso, el centro del stage, y metes la imagen dentro de este sprite. Lo que debes escalar es el sprite, NO LA IMAGEN.
Un saludo.
Zap
a ver si te vale esto...
El centro geométrico de una imagen rectangular está en la intersección entre las líneas (horizontal y vertical) que dividen en dos el rectángulo. En AS, y suponiendo que el eje esté en el vértice superior izquierdo, sería algo así:
centro_x = imagen._x + imagen._width/2;
centro_y = imagen._y + imagen._height/2;
Espero que esto te abra el camino!
Usuario desconocido
Intenté anidando el mc pero no me funcionó porque la imagen tiende que desplazarse y entonce sel centro cambia.
La segunda opción funciona para centrar un objeto pero no el centro geométrico de lo que estas viendo.
Lo que quiero hacer es similar a un zoom sobre un mapa que es más grande que mi pantalla. Estuve probando con una formula asi:
dx = desplazamiento en x
dy = desplazamiento en y
w = ancho del stage
h = altura del stage
k = escala
(-dx * k) + w
(-dy * k) + h
Ventd'Aval
Yo lo haria anidando, como te decian antes, de tal manera qu e el padre lo escalas, y el hijo lo trasladas de acue r do a SU mouseX local.
Osea, el padre no se mueve nunca, solo lo escalas, por tanto su centro es siempre la mitad de la pantalla... el hijo en cambio lo puedes mover todo lo que quieras, siempre escalará desde el centro de la pantalla...
prueba con algo asi:
<code>stage.addEventListener("mouseWheel",zoom);
stage.addEventListener("keyDown",key);
stage.addEventListener("mouseDown",down);
var ini;
function down(e) {
ini=new Point(padre.hijo.mouseX,padre.hijo.mouseY);
stage.addEventListener("mouseUp",up);
stage.addEventListener("mouseMove",move);
}
function move(e) {
padre.hijo.x=padre.mouseX-ini.x;
padre.hijo.y=padre.mouseY-ini.y;
}
function up(e) {
stage.removeEventListener("mouseUp",up);
stage.removeEventListener("mouseMove",move);
}
function key(e) {
var k=e.keyCode;
debug.text=k;
if (k==107 || k==187) zoom({delta:3});
else if(k==109 || k==189) zoom({delta:-3});
}
function zoom(e) {
padre.scaleX*=1+e.delta/30;
if(padre.scaleX<1) padre.scaleX=1;
padre.scaleY=padre.scaleX;
}</code>
http://www.ventdaval.com/upload/archivos/drag.html
Saludos :)
Usuario desconocido
oh!! Ya lo gré entender la solución del anidamiento, (es que soy un poco lento y me habia quedado clara) :P
Ya lo estoy probando y me funciona bastante bien!!!
Muchas gracias a todos!!