Dans une grille isométrique triangulé, ce triangle est un point donné?

voix
5

J'ai une grille isométrique triangulé, comme ceci: alt

Dans mon code, les triangles sont groupés par des colonnes.

Comme je l'ai passer la souris, je veux calculer ce triangle les coordonnées de la souris sont. Yat-il un algorithme simple de le faire?

Créé 15/02/2010 à 05:20
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
4

Ce que vous voulez faire est de transformer cela en une grille autant que possible, car les réseaux sont beaucoup plus faciles à travailler avec.

La première chose à faire est de travailler à ce que la colonne il est. Vous dites que vous stockez que donc il devrait être plus facile en faisant d'une simple division entière sur la coordonnée x par la largeur de colonne compensée par le début de la boîte. Facile.

Après cela, vous voulez travailler ce triangle, il est en (évidemment). Comment vous tournez partiellement ce dans une grille est vous prétendez que vous avez une pile de triangles à angle droit à la place d'une pile de triangles isométriques.

Les triangles ont une longueur le long de l'axe y (le côté de la colonne). Diviser ce nombre en deux et travaillez combien de marches vous êtes. Basé sur le nombre d'étapes vers le bas et si la colonne est que vous dire même ou impair si vous cherchez à:

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

ou l'inverse. A ce stade, il vous suffit de déterminer de quel côté de la ligne, il est à déterminer quel triangle il est en qui vous indique également quel triangle isométrique il se trouve.

Vous avez deux options pour cela.

  1. Vous pouvez utiliser quelque chose comme l'algorithme de ligne de Bresenham à pixelliser l'hypoténuse et quand vous frappez la colonne que vous êtes dans le travail si vous êtes au-dessus ou au-dessous de cette ligne;
  2. Parce que vous avez seulement deux grilles possibles ici (l'une étant l'inverse de l'autre il est donc vraiment une seule). Vous pouvez stocker un tableau de valeurs de ligne, en disant que la colonne 3, l'hypoténuse est à l'offset 2, alors que pour 6 il est à 4 et ainsi de suite.

Vous pouvez même utiliser (1) pour générer (2) comme une recherche rapide.

La seule autre chose à considérer est ce qui se passe si le curseur de la souris est sur un bord?

Créé 15/02/2010 à 05:32
source utilisateur

voix
3

Ceci est similaire à ce qu'a dit Cletus, mais une autre façon de regarder, je suppose.

Je suppose le côté du triangle est 1.

Supposons que vous ayez la grille comme ci-dessous:

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

Si l'on considère la grille dans un système de coordonnées dans lequel les axes x et y sont à un angle de 60 degrés, un point dont la coordonnée dans le système d'angle (x «y ») correspondra à la coordonnée dans la système orthogonal (avec une même origine dans la direction générale des axes) à (x, y).

Dans votre problème, vous avez (x, y), nous devons trouver (x «y »), puis déterminer le triangle.

Si i est le vecteur unitaire le long x et j orthogonale selon y, nous avons que

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

(Fondamentalement, le vecteur unitaire le long de l'axe y « angle » est i / 2 + sqrt (3) / 2 * j. Le vecteur unitaire le long de l'axe x est la même que la normale l'axe des x, à savoir i).

Ainsi

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

Solving donne:

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

On suppose pour l'instant que x « et y » sont positifs.

Maintenant, si c = [x '], la partie entière de x'

et r = [y '], la partie entière de y'

puis dans la grille (angulaire), le point se trouve dans la colonne et la rangée CTH rth. (Compter droite et en haut et commencer à compter à 0).

Ainsi, nous avons rétréci vers le bas de votre point à un parallélogramme

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

Maintenant, pour savoir quel triangle il est en vous pouvez considérer les parties fractionnaires de x « et y ».

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

À présent,

si {x} + {y} > 1, le point se trouve dans le triangle marqué par *. si {x} + {y} < 1, alors le point se trouve dans l'autre triangle. si {x} + {y} = 1, alors le point se trouve sur la ligne commune aux deux triangles.

Hope qui aide aussi.

Créé 15/02/2010 à 09:45
source utilisateur

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