2009-10-20 16 views
1

Je me suis assis avec un crayon pendant la plus grande partie de la soirée en essayant de me rappeler comment implémenter une fenêtre évolutive qui peut naviguer dans une zone 2D. Cela fait un moment que j'en ai entendu parler pour la première fois, mais je pense que j'ai compris, je dois juste vérifier.Besoin de quelqu'un pour vérifier que mes maths sont corrects

Nous avons un monde 2D avec un système de coordonnées cartésien "classique", les points de l'axe des x vers la droite, les points de l'axe des y vers le haut.

Dans la région du monde, nous avons une fenêtre rectangulaire définie par 2 points Pmin et Pmax, où: Pmin (xmin, ymin), Pmax (xmax, ymax). Ces points définissent la taille de fenêtre, l'emplacement et l'échelle

Dans la région du monde, nous avons un point P, où P Pmin < (x, y) < Pmax. (P est dans le viewport rect)

Pour afficher l'ensemble de la foutue chose, nous avons une toile (par exemple) qui a un système de coordonnées "altéré", les points de l'axe des x à droite, l'axe des y descend. La taille de la toile est MaxX et MaxY. La taille de la toile est fixe.

Maintenant, afin d'afficher le point P '(x', y ') dans la toile que je dois calculer sa position comme ceci:

x' = (x - xmin) * Sx, où Sx = MaxX/(xmax - xmin)

y' = MaxY - (y - ymin) * Sy, où Sy = MaxY/(ymax - ymin)

* S'il vous plaît noter que y » coord est inversée en raison de la toile de système de coordonnées

Dans d'autres w ords: les maths ci-dessus doivent prendre soin d'afficher un point tout en prenant en compte la taille et la position de vieport. Ai-je raison ? Si non, s'il vous plaît me prouver le contraire.

Répondre

2

Oui, c'est correct. Tous les points de la fenêtre apparaîtront sur la toile - et seulement ces points - et tout apparaîtra à droite avec les distances préservées.

+1

Bravo pour la réponse rapide - Je peux maintenant mourir un homme heureux – Maciek

0

Vous pouvez trouver utile de créer une classe pour la fenêtre qui gère l'échelle et les plages. Il peut avoir des méthodes telles que

Point2 vp = viewport.transformFromWorld(Point2 pw); 

et l'inverse:

Point2 pw = viewport.transformToWorld(Point2 vp); 

Ceci est utile si vous choisissez un point du point de vue avec les coordonnées de viewport et que vous souhaitez transformer en monde.