2010-06-30 17 views
6

Tengo algunas imágenes dibujadas en un lienzo HTML5 y quiero comprobar si se presionan con el clic del mouse. Parece fácil, tengo los límites de las imágenes, sin embargo, las imágenes se transforman (traducidas y escaladas). Desafortunadamente, el contexto no tiene un método para obtener la matriz de transformación actual, y tampoco hay API para la multiplicación de matrices. Parece que la única solución es hacer un seguimiento de las transformaciones e implementar la multiplicación de matrices. Sugerencias son bienvenidas.HTML5 canvas hittesting

+0

Después de pensar más, me di cuenta de que incluso si el contexto tuviera un método para obtener la matriz de transformación actual, no sería útil, ya que necesito la matriz de transformación de imagen haciendo clic y para entonces el contexto tiene una transformar. Lo que probablemente necesito es un gráfico de escena, implemente uno simple o use una biblioteca como Cake JS. –

+0

No necesita matrices para traducir y escalar. Por ejemplo, para traducir y escalar una coordenada X del mouse, use newPointX = event.x * scaleX + translateX –

+0

Gracias, tiene razón, en este caso no tengo que implementar la multiplicación de matrices. –

Respuesta

17

Este es un problema común en el mundo de gráficos en 3D (OpenGL) también.

La solución es crear un objeto de lienzo auxiliar (que no se muestra) y volver a dibujar su imagen en él. El sorteo es exactamente el mismo que con tu sorteo de lienzo principal, excepto que cada elemento se dibuja con un color único. A continuación, busca el píxel correspondiente a la selección del mouse y lee su color, que le proporcionará el elemento correspondiente (si corresponde).

Este es un método de uso común en el mundo OpenGL. Puede encontrar descripciones de este por Google términos como "opengl object picking". Aquí está one of the many search results.

Actualización: La especificación de lienzo HTML5 ahora incluye hit regions. No estoy seguro de hasta qué punto estos son compatibles con los navegadores.

+0

¡Idea genial! Bien declarado –

+0

Genius. ¡He votado 10 veces si pudiera! –

+1

El problema aquí es que todos los lienzos realizan combinaciones de colores no opcionales y anti aliasing. Resultando entre colores cuando los objetos se topan entre sí. Estos colores intermedios pueden acercarse lo suficiente a otros identificadores de color que haya almacenado para que un área fronteriza pueda representarse erróneamente como un golpe para un objeto diferente. No estoy seguro de la mejor manera de evitar esto. Usar un lienzo por cada objeto detectable desperdicia demasiada memoria, y renderizar cada objeto por separado mientras el mouse se está moviendo y comprobando parece que perderá demasiado rendimiento. –