La conversion entre cartésiens et les coordonnées de l'écran
Pour mon jeu j'ai besoin de fonctions de conversion entre les deux systèmes de coordonnées. Eh bien, il est principalement question de mathématiques, mais ce dont j'ai besoin est le C++ le code pour le faire et un peu d'explication sur la façon de résoudre mon problème.
Écran coordiantes:
a) le coin en haut à gauche est 0,0
b) pas moins de valeurs
c) droit += x (le plus est la valeur de x, la plus à droite est le point)
d) bas +=y
Cartésien de coordonnées 2D:
un) point milieu est (0, 0)
b) les valeurs négatives existent
c) droit += x
d) bas -= y (moins il y, le plus bas est le point)
J'ai besoin d'un moyen facile de traduire à partir d'un système à l'autre et vice versa. Pour ce faire, (je pense) j'ai besoin de savoir où est le point (0, 0) [coin en haut à gauche dans l'écran des coordonnées] placé dans les coordonnées cartésiennes.
Il y a cependant un problème que pour certains point en coordonnées cartésiennes après le traduire à l'écran, la position en coordonnées d'écran peut être moins, ce qui est un non-sens. Je ne peux pas mettre coin supérieur gauche de l'écran de coordonnées (-inifity, +infini) coordonnées cartésiennes...
Comment puis-je résoudre ce problème? La seule solution que je vois est de la place de l'écran (0, 0) en coordonnées cartésiennes (0, 0) et n'utiliser que le quartier IV de système cartésien, mais dans ce cas, à l'aide de système cartésien est inutile...
Je suis sûr qu'il existe des moyens pour traduire à l'écran des coordonnées en coordonnées cartésiennes et vice-versa, mais je suis en train de faire quelque chose de mal dans ma pensée que les valeurs négatives.
il veut avoir des coordonnées négatives
l'axe Y est différente à l'écran et cartésienne.
Je vais prendre votre parole, mais je pensais Cartésien signifie simplement qu'il est R^2 avec L2 métrique (en.wikipedia.org/wiki/Cartesian_coordinate_system). Vous pouvez le retourner de toute façon que vous voulez tant que le retournement/transformation est une isométrie.
eh bien, vous avez raison, mais je pense que la question est understable.
OriginalL'auteur user1873947 | 2013-02-14
Vous devez vous connecter pour publier un commentaire.
L'algorithme de base de traduire à partir des coordonnées cartésiennes en coordonnées d'écran sont
Mais comme vous l'avez mentionné, cartésien de l'espace est infini, et votre espace à l'écran ne l'est pas. Ceci peut être facilement résolu en changeant la résolution entre l'écran de l'espace et de l'espace cartésien. L'algorithme ci-dessus fait 1 unité dans l'espace cartésien = 1 unité/pixel dans l'espace de l'écran. Si vous le permettez pour d'autres ratios, vous pouvez "zoomer" ou dans votre espace à l'écran pour couvrir l'ensemble de l'espace cartésien nécessaire.
Ce serait changer l'algorithme ci-dessus pour
Maintenant, vous gérer les négatifs (ou trop larges) screenX et screenY en modifiant votre facteur de zoom jusqu'à ce que toutes vos coordonnées cartésiennes tiendra sur l'écran.
Vous pourrait également permettre d'panoramique de l'espace de coordonnées, de façon à ce, permettant au centre de l'espace cartésien à être au centre de l'écran. Cela pourrait aussi aider en permettant à votre zoom_factor de rester aussi serré que possible, mais également d'ajustement des données qui n'est pas uniformément répartie autour de l'origine de l'espace cartésien.
Ce serait de modifier l'algorithme pour
OriginalL'auteur MerickOWA
Vous devez connaître la taille de l'écran afin d'être en mesure de convertir
Convertir Cartésiennes:
Convertir à l'Écran:
Pour le cas où vous avez un négatif de la valeur à l'écran:
Je ne voudrais pas vous inquiéter à ce sujet, ce contenu sera simplement coupées de sorte que l'utilisateur ne verra pas. Si cette est un problème, je voudrais ajouter quelques contraintes qui empêchent les coordonnées cartésiennes d'être trop grand. Une autre solution, puisque vous ne pouvez pas avoir les bords de être +/- l'infini, serait à l'échelle de vos coordonnées (par exemple, 1 pixel = 10 cartésien), appelons cet
scalefactor
. Les équations sont maintenant:Convertir Cartésiennes avec facteur d'échelle:
Convertir à l'Écran avec facteur d'échelle:
OriginalL'auteur sgonzalez
Vous besoin de connaître la largeur et la hauteur de l'écran.
Alors vous pouvez faire:
Et:
OriginalL'auteur Daniel Pelsmaeker
Vous aurez toujours le problème que le résultat pourrait être hors de l'écran, soit comme une valeur négative, ou une valeur plus grande que le disponible de la taille de l'écran.
Parfois, qui n'a pas d'importance: par exemple, si votre API graphiques accepte les valeurs négatives et les clips de votre dessin pour vous. Parfois, il sera question, et pour ces cas, vous devriez avoir une fonction qui vérifie si un ensemble de coordonnées de l'écran sur l'écran.
Vous pouvez également écrire votre propre écrêtage des fonctions qui essaient de faire quelque chose de raisonnable avec des coordonnées qui tombent hors de l'écran (tels que la troncation négatif à l'écran des coordonnées à 0, et les coordonnées qui sont trop gros pour le maximum de l'écran de coordonnées). Cependant, gardez à l'esprit que "raisonnable" dépend de ce que vous essayez de faire, de sorte qu'il pourrait être préférable de tenir à distance sur la définition de ces fonctions jusqu'à ce que vous réellement besoin d'eux.
En tout cas, comme d'autres réponses ont noté, vous pouvez convertir entre les systèmes de coordonnées:
et
OriginalL'auteur comingstorm
J'ai un peu de boost c++ pour vous, basé sur l'article de microsoft:
https://msdn.microsoft.com/en-us/library/jj635757(v=vs. 85).aspx
Vous avez juste besoin de la connaissance de deux points de l'écran et deux points dans votre système de coordonnées. Ensuite, vous pouvez convertir point d'un système à un autre.
OriginalL'auteur Serov Danil