¿Cómo debería calcular la posicion de un objeto con zoom?

Iniciado por WHK, 31 Julio 2016, 22:57 PM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Hola, estoy intentando calcular la posicion de un objeto sobre una superficie pero me está costando un poco.

Tengo el lienzo que tiene un tamaño de 100x200 pixeles, este lienzo se encuentra posicionado al centro de la pantalla el cual tiene un tamaño dinámico, sobre el lienzo central se posiciona el objeto que puede tener una posición, por ejemplo de 10px de izquierda a derecha mas el pixel de inicio del lienzo.

Por ejemplo, digamos que la pantalla es de 1024x768 y el lienzo es de 100x200, entonces si el objeto está 10 pixeles dentro del lienzo hacia la derecha, quiere decir que la cantidad de pixeles hacia la derecha son ((1024/2)-(100/2))+10

El problema que tengo es que de manera dinámica le hago zoom al lienzo para ajustarlo a la pantalla, digamos que este facto de zoom es de 2.5, eso quiere decir que el lienzo es un 250% mas grande desde el centro hacia afuera para ser ajustado al tamaño completo de la pantalla.

Mi problema ahora se encuentra cuando necesito saber la exactitud de la posición del objeto que tambien fue redimensionado sobre el mismo lienzo.

No tengo acceso a los valores nuevos de cada objeto dibujado sobre el lienzo porque el sistema sobre el cual estoy trabajando no deja un historial de objetos, cuando se dibujan pasa a ser un lienzo único y no separado por capas (estoy usando canvas) asi que cuando hago la redimensión del lienzo el area de acción del objeto no se redimensiona (porque no es un objeto dibujable, es el area de un botón).

Lo que necesito es calcular la posicion exacta del boton ya redimensionado para poder realizar las acciones al momento de hacer click sobre el botón.



Lo azul es la pantalla, el rojo es el lienzo y el verde es el botón.

Tengo posiciones top, bottom, left y right, es un area cuadrada, lo que traté de hacer es aumentar cada valor multiplicado por la mitad del factor de zoom pero no me resultó, también intenté aumentar proporcionalmente el tamaño del area del boton pero me es dificil poder posicionarlo ya que por ejemplo si el boton esta en la ezquina superior derecha la posicion top y left no debiera cambiar como si estubiera en la posicion right bottom porque el superior se corre hacia arriba y la izquierda y el de abajo hacia abajo y la izquierda y si estubiera al centro es proporcional.

¿A alguien se le ocurre como hacer esto?

WHK

Lo he solucionado :D en ves de hacer zoom desde el centro hice zoom desde la ezquina superior izquierda, de esa manera todos los objetos son posicionados sin el valor de espacio entre el inicio de pantalla e inicio del lienzo, entonces por ejemplo si un objeto tiene un valor left de 1 entonces es 1 en ves de 1+((lienzo.width/2)-(pantalla.width/2)), de esta manera cuando hago zoom en ves de recalcular el valor del area de acción solo disminuyo el valor del puntero del mouse o touch, por ejemplo last_x = (last_x / factor_zoom), esto hace que cuando pase el mouse sobre la pantalla por dentro la app será como si el mouse estuviera disminuido y se moviera solo dentro del area de trabajo (lienzo) :D

ivancea96

Bueno, primero, la posicion del botón dentro del lienzo redimensionado, que será left*factor, top*factor.

Ahora solo queda saber el top y left del lienzo.
Si la pantalla es de 800x600, el centro sería 400x300. Si el lienzo es de 200x100, y esta pintado en el centro, el left del lienzo redimensionado será 400-(200/2)*factor. Lo mismo para el top.
Si el factor es 2, left=200.
Si el botón estuviera en (15,40), por ejemplo, en el redimensionado estaría en (30,80).
Por tanto, quedaría: (left=200) + 30, osea left del botón = 230.
Con los mismos cálculos, el top del botón sería 300-(100/2)*2 + 80, osea 280.


Si me entendiste, prueba a ver si te va, no vaya a haber hecho algún cálculo mal. En definitiva, el tema es que las distancias se multiplican por el factor desde el punto del zoom. Si el punto es el centro, pues habrá que tenerlo en cuenta.

Si no me entendiste, cosa probable, dame todos los valores de tu prueba y lo calculo. Luego compruebas y ala xD



Bueno, ahora que iba a comentar respondiste :'(
Pero lo dejo igual, por si quisieras hacer el zoom desde el centro xD

WHK