En una cuadrícula isométrica triangulada, lo triángulo es un punto dado en el?

votos
5

Tengo una cuadrícula isométrica triangulada, de esta manera: texto

En mi código, triángulos están agrupados por columnas.

A medida que pasa el ratón, quiero calcular qué triángulo de las coordenadas del ratón están en. ¿Existe un algoritmo simple para hacer eso?

Publicado el 15/02/2010 a las 05:20
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
4

Lo que se quiere hacer es convertir esto en una rejilla tanto como sea posible, porque las redes son mucho más fáciles de trabajar.

El primero que se hace es trabajar con lo que la columna que se encuentra. Usted dice que la tienda que lo que debería ser más fácil haciendo una división entera simple en la coordenada x de la compensación por el inicio cuadro de ancho de columna. Fácil.

Después de que desea trabajar en lo que es en triángulo (obviamente). ¿Cómo se activa parcialmente este en una cuadrícula es que pretender que usted tiene una pila de triángulos de ángulo recto en lugar de una pila de triángulos isométricos.

Los triángulos tienen una longitud a lo largo del eje y (el lado de la columna). Divida ese número en dos y calcular cuántos pasos hasta que eres. Basado en el número de pasos hacia abajo y si la columna es par o impar le dirá si usted está buscando en:

+--------+
|-_      |
|  -_    |
|    -_  |
|      -_|
+--------+

o a la inversa. En este punto sólo tiene que determinar qué lado de la línea se pasa a determinar qué triángulo rectángulo que se encuentra, que también le dirá qué triángulo isométrica que se encuentra.

Usted tiene un par de opciones para esto.

  1. Se podría utilizar algo como algoritmo de bresenham rasterizar la hipotenusa y cuando se pulse la columna estás en el trabajo si estás por encima o por debajo de esa línea;
  2. Ya que sólo tiene dos rejillas posibles aquí (uno que es el inverso del otro por lo que es en realidad sólo una). Se podía almacenar un conjunto de valores de fila, diciendo que para la columna 3, la hipotenusa es 2 en el desplazamiento, mientras que para el 6 que es a las 4 y así sucesivamente.

Incluso se puede utilizar (1) para generar (2) como una búsqueda rápida.

La única otra cosa a considerar es lo que sucede si el cursor del ratón está sobre un borde?

Respondida el 15/02/2010 a las 05:32
fuente por usuario

votos
3

Esto es similar a lo que dijo Cletus, pero de una manera diferente de verlo, supongo.

Estoy asumiendo que el lado del triángulo es 1.

Suponga que tiene la red de la siguiente manera:

       y'
      /
     /__/__/__/__/__/__/
    /__/__/__/__/__/__/
   /__/__/__/__/__/__/____ x'
(0,0)

Si se tiene en cuenta la red en un sistema de coordenadas en el que la X & ejes y están en un ángulo de 60 grados, un punto cuyas coordenadas en el sistema de ángulo (x 'y') corresponderá a la coordenada en el sistema ortogonal (con mismo origen una dirección general de ejes) a (x, y).

En su problema, se le da (x, y), tenemos que encontrar (x 'y') y luego averiguar el triángulo.

Si i es el vector unitario a lo largo de x y j la ortogonal a lo largo de y, entonces tenemos que

x'* i + y'( i/2 + sqrt(3) * j /2) = xi + yj.

(Básicamente el vector unitario a lo largo del eje y 'en ángulo' es i / 2 + sqrt (3) / 2 * j. El vector unitario a lo largo del eje x es el mismo que el normal de eje x, es decir, i).

Así

x' + y'/2 = x
y' * sqrt(3)/2 = y

La resolución de da:

y' = 2*y/sqrt(3)
x' = x - y/sqrt(3)

Supongamos por ahora que x 'e y' son positivos.

Ahora bien, si c = [x '], la parte entera de x'

y r = [Y '], la parte entera de y'

a continuación, en la cuadrícula (angular), el punto se encuentra en la columna de la CTH y la fila r-ésimo. (Contando la derecha y hacia arriba y empezar a contar a 0).

Así, hemos reducido su punto de un paralelogramo

       ____
      /\ * /   
     /___\/
   (c,r)

Ahora con el fin de averiguar qué triángulo que está en usted puede considerar las partes fraccionarias de X 'e Y'.

{x} = x' - [x'] = x' - c.
{y} = y' - [y'] = y' - r.

Ahora,

Si {x} + {y} > 1, a continuación, el punto se encuentra en el triángulo marcado con *. Si {x} + {y} < 1, a continuación, el punto se encuentra en el otro triángulo. Si {x} + {y} = 1, a continuación, el punto se encuentra en la línea común a los dos triángulos.

Esperamos que ayuda también.

Respondida el 15/02/2010 a las 09:45
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more