Suite

Comment convertir une position d'écran en coordonnées géographiques ?


Je recherche des ressources qui expliquent comment je dois convertir les coordonnées d'écran (le point que je choisis à l'écran) en coordonnées géographiques (lat / lon).

Je veux créer une application où, dans la version simplifiée, je peux choisir un point sur une carte à l'écran et les coordonnées géographiques sont transmises à ma base de données. J'ai un service de tuiles qui sert des tuiles raster à partir d'un fichier .MBTILES, généré à partir de données OSM stockées dans une base de données Postgres. Le client serait probablement construit avec .NET, probablement MVC pour une application Web ou un WPF pour une application de bureau Windows.

Je recherche des concepts pour pouvoir faire des recherches supplémentaires par moi-même afin de déterminer ce que je dois faire ensuite. Quelles sont les bonnes pratiques pour ce faire ?


Premièrement, il est utile de savoir ce que vous faites en termes généralement utilisés. Dans ce cas, il s'agit d'un projection inverse ou un reprojection lorsque vous passez des coordonnées projetées (ou planes) "en arrière" aux coordonnées géographiques (ou sphéroïdales).

Deuxièmement, vous devez savoir quel système de coordonnées projetées vous avez sur votre écran, afin de spécifier l'inverse. Ne connaissant pas OSM, et basé, pour l'instant, uniquement sur ce show-a-kml-which-use-longitude-and-latitude-epsg4326-in-google-osm-project, OSM utilise le CRS (coordinate reference system) connu sous le nom d'EPSG : 3857.

Troisièmement, que CRS spécifie non seulement la méthode de projection mais aussi le données -- détails de l'ellipsoïde utilisé pour représenter la Terre. Il est utile de comprendre cela afin de passer correctement à l'étape suivante. Vous avez besoin que vos coordonnées géographiques elles-mêmes soient sur le bon datum/ellipsoïde.

Quatrièmement, vous devriez trouver une bibliothèque/un outil logiciel existant qui, compte tenu de vos deux CRS - projetés et non projetés - et de certaines coordonnées projetées, transforme (déprojete) vos coordonnées en lat-long. PostGIS lui-même fait une partie de cela ou utilise GDAL/OGR ou d'autres.

Étant donné que de nombreux outils de reprojection ne démarrent qu'à partir d'unités de cartographie du "monde réel" (par exemple, m ou ft) et que vos unités de départ sont des pixels d'écran, vous mai besoin d'une étape préalable 4: convertissez les pixels x-y de votre écran en unités X-Y au sol, en fonction de l'échelle de la carte. C'est un simple scalaire.


Traduire entre les coordonnées cartésiennes et d'écran

Pour mon jeu, j'ai besoin de fonctions pour traduire entre deux systèmes de coordonnées. Eh bien, c'est principalement une question mathématique, mais ce dont j'ai besoin, c'est du code C++ pour le faire et d'un peu d'explications sur la façon de résoudre mon problème.

c) droite += x (plus il y a de valeur x, plus il y a de point à droite)

d) bas -= y (moins y est, plus en bas est point)

J'ai besoin d'un moyen facile de traduire d'un système à un autre et vice versa. Pour ce faire, (je pense) j'ai besoin de connaissances comme où se trouve le (0, 0) [coin supérieur gauche des coordonnées de l'écran] placé dans les coordonnées cartésiennes.

Cependant, il existe un problème selon lequel pour un certain point des coordonnées cartésiennes après l'avoir traduit en coordonnées d'écran, la position dans les coordonnées d'écran peut être négative, ce qui est un non-sens. Je ne peux pas mettre le coin supérieur gauche des coordonnées de l'écran dans les coordonnées cartésiennes (-inifity, +infinity).

Comment puis-je résoudre ça? La seule solution à laquelle je puisse penser est de placer l'écran (0, 0) en cartésien (0, 0) et d'utiliser uniquement le quart IV du système cartésien, mais dans ce cas, l'utilisation du système cartésien est inutile.

Je suis sûr qu'il existe des moyens de traduire les coordonnées de l'écran en coordonnées cartésiennes et vice versa, mais je fais quelque chose de mal dans ma réflexion avec ces valeurs négatives.


Évitez la traduction de coordonnées

Vous pourrez peut-être éviter complètement la conversion entre les systèmes de coordonnées.

Les SVG intégrés dans la page HTML (plutôt qu'une image ou un arrière-plan CSS) font partie du DOM et peuvent être manipulés de la même manière que d'autres éléments. Par exemple, prenons un SVG basique avec un seul cercle :

Vous pouvez appliquer des effets CSS à ceci :

Vous pouvez également attacher des gestionnaires d'événements pour modifier les attributs :

L'exemple suivant ajoute trente cercles aléatoires à une image SVG, applique un effet de survol en CSS et utilise JavaScript pour augmenter le rayon de dix unités lorsqu'un cercle est cliqué.


Usine WebGL

Clairement expliqué, merci. Pouvez-vous donner la syntaxe javascript correspondante ?

Il s'agit ici d'une solution très générique, il n'y a donc pas de syntaxe JavaScript unique. De quelles données (quelles matrices et sous quel format) disposez-vous en entrée ?

J'ai une série de coordonnées x,y,z comme un tableau de sommets.
(par exemple:
0.205811 0.423383 0.403992
0.432068 0.603759 0.630250
1.032178 1.203868 1.230359)
J'ai du mal à passer de la 2d à la 3d. Je suivais cet algorithme http://stackoverflow.com/questions/5613718/click-to-zoom-in-webgl qui semble similaire à l'idée décrite ci-dessus, mais les coordonnées que j'obtiens ne correspondent pas aux sommets réels Je fais un graphique. Un conseil comment faire cela ?

Pouvez-vous me décrire plus en détail ce que vous faites - est-ce 3D -> 2D -> 3D, est-ce que certaines des coordonnées correspondent (par exemple, x et y le sont, z ne l'est pas) ?

Je trace des données 3D. J'aimerais pouvoir cliquer sur une coordonnée d'écran (qui est essentiellement en 2D) et en dériver le point 3D correspondant le plus proche. Dans l'exemple il prend 2 valeurs arbitraires pour z : -1 et 0, puis fait une soustraction entre les 2 matrices. Aucune des valeurs résultantes ne correspond. Peut-être que j'ai mal compris la mise en œuvre ?

Déterminer la coordonnée Z est un peu plus délicat - vous devriez vérifier une intersection de rayon avec votre objet/plan. Néanmoins, les coordonnées x et y doivent être correctes. J'essaie d'expliquer un peu plus le code, peut-être que vous trouvez le bug :

double x = 2.0 * winX / clientWidth - 1
double y = - 2,0 * winY / clientHeight + 1

- winX et winY - coordonnées de la souris par rapport à la fenêtre ou au canevas 3D, et non à l'ensemble de l'écran ou de la fenêtre du navigateur

- clientWidth et clientHeight identiques - taille de la fenêtre canvas/3D

Matrix4 viewProjectionInverse =
inverse(projection Matrice *
viewMatrix)
Point3D point3D = nouveau Point3D(x, y, 0)
return viewProjectionInverse.multiply(point3D)

Ici, il ne s'agit que de mathématiques, avec z = 0 comme référence (vous devriez toujours obtenir x et corriger). Cet ordre de multiplication est le maire de la rangée - peut-être que vous utilisez le maire de la colonne ?

Vous pouvez également vérifier ce que vous obtiendrez lorsque vous passerez du point 3D que vous avez obtenu (correct ou non) en 2D.

var monde1 = [0,0,0,0]
var monde2 = [0,0,0,0]
var dir = [0,0,0]
var w = event.srcElement.clientWidth
var h = event.srcElement.clientHeight
// calcule les coordonnées de l'espace de découpage x,y
var x = (event.offsetX-w/2)/(w/2)
var y = -(event.offsetY-h/2)/(h/2)
mat4.inverse(pvMatrix, pvMatrixInverse)
// convertit les coordonnées de l'espace clip en espace universel
mat4.multiplyVec4(pvMatrixInverse, [x,y,0,1], world1)

mon écran (par rapport au canevas) x, y sont corrects - j'ai essayé un certain nombre de façons différentes d'y parvenir et j'ai obtenu les mêmes valeurs à chaque fois.
puis en prenant l'inverse de ma pvmatrix, puis en multipliant cela par [x,y,0,1] (pour le moment, disons que tous mes z' sont à 0). Ensuite, le résultat devrait être dans world1. Mais lorsque je clique sur 1,1,0, je n'obtiens pas de résultat correspondant.

Le code me semble correct - la seule valeur inconnue ici est la pvMatrix. Je suppose que l'un devrait être correct puisque vous effectuez le rendu de votre scène, mais vérifiez si sa valeur est correcte. J'essaierais (si vous ne l'avez pas déjà fait) de reconvertir world1 en espace écran (obtenez-vous à nouveau les valeurs event.offSet ?). Sinon c'est le même calcul que dans mon code

Bon tuto, clair et agréable à lire.

La seule petite chose que j'ai remarquée, c'est :

Matrix4 viewProjectionInverse = inverse(projectionMatrix * viewMatrix)

Ordre de la multiplication matricielle :

L'ordre de multiplication doit être changé pour être :

Merci pour un excellent tutoriel.

Salut Ben, merci pour le commentaire, j'apprécie beaucoup! Concernant l'ordre matriciel : l'ordre de multiplication est en fait une chose de convection. Selon ce que vous interprétez les points en tant que vecteurs de colonne ou de ligne, et en utilisant le mode de ligne ou de colonne principale, l'ordre peut changer. Dans ce cas spécifique, j'ai supposé ici que les points étaient des vecteurs de ligne et que les matrices étaient des lignes principales (par exemple, un composant de traduction dans les indices de matrice 12, 13 et 14). Écrivez sur un morceau de papier le point d'opération * vue du monde * projection en notation mathématique et vous verrez ce que je veux dire.

P.S. J'avais de toute façon prévu d'avoir un ou deux articles sur les transformations en détail, merci de me le rappeler :)

Joli tuto Denis ! Quelques points :

1) Pouvez-vous décrire exactement ce que vous avez fait lors d'une conversion 3D en 2D. Le code est bien, mais pour moi, il donne de petites erreurs de décalage, donc pour rectifier cela, je dois comprendre ce que le code essaie de faire.

2) le lien du didacticiel de sélection de souris ne fonctionne pas.

Hy Amit, désolé pour le lien cassé - je vais essayer de trouver un bon substitut (il y avait un pdf sur le net où j'ai vu ces calculs pour la première fois il y a quelques années, et je ne me souviens plus maintenant comment il s'appelait) .

Concernant la conversion 3D->2D. l'ensemble du processus peut être divisé en quelques étapes simples, en supposant que nous ayons un point 3D en coordonnées "absolues". Nous essayons d'abord de déplacer cette 3D dans l'espace relatif de la caméra en la multipliant avec la matrice de vue. Après cela, le produit est multiplié par la matrice de projection pour obtenir le point en coordonnées de découpage.

Puisque la projection et la matrice de vue sont connues au début, je les ai d'abord multipliées, puis la matrice de résultat avec le point (pas nécessaire pour un point, mais imaginez que vous aviez 50 000 points à convertir pour une raison quelconque).

Une fois ces étapes terminées, nous obtenons un point dans l'espace de coordonnées normalisé ([-1,1], [-1,1]). Nous transformons ce point 2D en domaine ([0,1], [0,1]). Maintenant, en multipliant cela par la largeur/hauteur de la fenêtre, nous obtiendrons les coordonnées en pixels de l'écran.

Des erreurs mineures sont à prévoir (notamment en raison de l'arrondi lors de l'obtention des coordonnées normalisées). Vous pouvez essayer de mieux spécifier la fonction ronde - peut-être en l'utilisant ici
http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

"Une fois ces étapes terminées, nous obtenons un point dans l'espace de coordonnées normalisé ([-1,1], [-1,1])". Comment?

Je l'ai fait en plongeant les coordonnées de découpage x,y,z par la coordonnée de découpage W. (qui représente le facteur d'échelle de la scène).

Avez-vous manqué cette étape ou ce n'était pas vraiment nécessaire ?

En théorie, cela devrait être considéré et la division devrait être faite. Dans ce cas, j'ai supposé que la coordonnée w est 1 et cohérente dans toutes les données (donc pas de division, je devrais le signaler dans le message).

Vérifiez ces deux liens ici, peut-être qu'ils vous aideront :

Quoi qu'il en soit, quel est le problème exact que vous rencontrez?

Je travaille sur un prototype qui m'a demandé de faire du picking et de la transformation 3D->2D. J'ai fait les deux, mais trouver la normalisation a pris beaucoup de temps. Je pense que ce serait une bonne idée si vous expliquiez l'étape de normalisation dans le post.

J'ai également pris W=1 au départ, mais après avoir multiplié [x,y,z,W] avec la matrice de vue et la matrice de projection, W devient >1 et c'est pourquoi il était strictement nécessaire que je divise x,y par W.

J'ai lu la fonction de conversion get3dPoint mais je n'ai pas compris comment l'utiliser. Par exemple, j'ai une image d'un point avec les coordonnées (x, y) respectivement (2.3) comment puis-je trouver le Point3D (x, y, z).

Salut Denis,
Merci beaucoup pour le tuto. Je me demandais si vous aviez un moment libre pour m'aider à résoudre ce problème. J'ai construit l'exemple en javascript, mais j'ai un peu de mal à reconvertir d'un point 3D en xy. En d'autres termes, appliquer la viewProjectionMatrix sur le point 3D pour obtenir le coord d'écran normalisé.

//commençant par les coords d'écran nomalisés :
screen3D[0] = 0.5
écran3D[1] = 0.5
screen3D[2] = 0
screen3D[3] = 1

var viewProjectionMatrix = Matrix.mult(projectionMatrix,viewMatrix)
var invViewProjectionMatrix = Matrix.inverse(viewProjectionMatrix)

//Appliquer la matrice de vue de projection inverse nous amène dans l'espace mondial
var worldM = Matrix.multTranslate(invProjectionViewMatrix,screen3D)

//Je peux maintenant multer ce worldM matix par viewProjectionMatrix pour revenir à mes coordonnées d'écran normalisées.

var normScreenM = Matrix.multTranslate(projectionViewMatrix,worldM)

//Cependant en prenant les coordonnées worldPoint.
var worldPoint = Matrix.getTrans(worldM)
//. et multiplier la projectionViewMatrix ne fonctionne pas
var normScreenM2 = Matrix.multTranslate(projectionViewMatrix,worldPoint)

Donc, je n'obtiens pas les coordonnées d'écran normalisées à partir du produit de (worldPoint * projectionViewMatrix). Je ne peux les récupérer que si j'ai la matrice complète à multiplier (worldM * projectionViewMatrix).
J'essayais d'appliquer les opérations inverses en tant que contrôle de cohérence, assurez-vous que tout a été vérifié. Malheureusement, il y a quelque chose que j'ai raté. Je ne peux pas revenir à mes coordonnées d'écran normalisées avec le worldPoint. J'apprécierais donc vraiment si vous avez un moment / une idée de ce qui ne va pas pour m'aider à résoudre cette banane cérébrale.

la vue claire et réelle fournie par les derniers dispositifs d'affichage rend notre expérience réelle. le système d'affichage peut être rendu plus vivant avec les supports appropriés. pour de beaux rideaux pour la maison et bien d'autres, vous pouvez visiter..
Entreprise d'écrans de projection
Rideau de théâtre"

Article très utile, merci ! :) En fait, j'ai écrit un article similaire pour effectuer la même conversion, mais je travaille spécifiquement dans Maya. Pour les personnes qui ont des problèmes avec la partie normalisation, cela vous sera peut-être utile : http://www.gouvatsos.com/how-to-transform-3d-coordinates-to-2d-screenspace-and-vice-versa

Si l'origine de l'écran se trouve dans le coin inférieur gauche au lieu d'en haut à gauche, que devez-vous changer pour convertir de 2d->3d ?

(1) double y = - 2,0 * winY / clientHeight + 1

(2) double y = 2,0 * winY / clientHeight - 1
Vous devez donc utiliser la même approche qu'avec l'axe des x.

En plus de cela, vous obtiendrez le même résultat si vous remplacez "winY" par "clientHeight - winY" dans (1).

Ne devriez-vous pas diviser par z pour obtenir les coordonnées de l'écran ?

J'ai fait cela en utilisant glm, et cela semble fonctionner (code réel):

glm::vec2 getScreenCoord(glm::vec3 pos)<

glm::vec4 p = cameraPerspectiveMatrix*glm::vec4(pos, 1.0)
glm::vec2s
s.x = int(((p.x/p.z + 1.0)/2.0) * winWidth + .5)
s.y = int(((1.0 - p.y/p.z)/2.0) * winHeight + .5)
Retour
>

En outre, vous pouvez extraire le z-coord du z-buffer, quelque chose comme

GLfloat zbuf
getPixelInfo(x,y, GL_COLOR_ATTACHMENT0, GL_DEPTH_COMPONENT, GL_FLOAT, &zbuf)
double znorm = 2.0 * zbuf - 1.0
double zreal = 2.0 * clipNear * clipFar / (clipFar + clipNear - znorm * (clipFar - clipNear))

J'ai passé les dernières heures à essayer de déboguer mon code et à lire un tas de solutions disant de diviser par w, mais cela n'aidait pas. Enfin j'ai trouvé votre commentaire et divisé par z (en plus de w, au cas où cela ferait quelque chose d'utile) et cela a complètement résolu mon problème ! J'ai également exclu les étiquettes de rendu (mon cas d'utilisation pour ce code) lorsque z < 0.0 (c'est-à-dire derrière la caméra), ainsi que le cas dégénéré lorsque w = 0. Merci d'avoir posté ce commentaire ! Cordialement, L'Avenir.

Veuillez vous référer à http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/MousePicking pour une explication détaillée de la façon dont x et y sont calculés sans la nécessité de z.

Quant à glm, il s'agit d'une approche de codage générale écrite avec WebGL à l'esprit, sans l'utilisation de bibliothèques spéciales.

J'ai un problème : je ne trouve aucun algorithme ou programme décrivant comment effectuer la conversion du point 2D en 3D
comment j'ai trouvé Z
point(x,y) --> point(x,y,z)
Aidez-moi, s'il vous plaît

J'ai enfin compris. Le problème est lorsque vous définissez la caméra Z sur une valeur particulière (dans l'article 0), alors le monde X et Y calculent réellement pour s'adapter à ce Z, donc lorsque vous voulez calculer les coordonnées du monde X,Y, vous devez savoir pour quel monde Z vous trouvez ce X a Y. Une fois que vous le savez. Vous pouvez calculer la coordonnée de la caméra Z que vous pouvez enfin utiliser pour calculer le monde X,Y comme décrit dans l'article. Alors comment trouve-t-on la cameraZ quand on connait worldZ ? Vous devez prendre un avion qui contient les coordonnées worldZ et a une normale identique au vecteur de direction de recherche (c'est la cible - eyeCoor) Une fois que vous avez cet avion, vous devez le transformer en espace de caméra (par exemple en prenant trois points que l'avion contient , les transformer puis refaire à partir d'eux). Et en mettant la caméra X, Y au plan équatorien, vous obtenez la caméra Z. Et c'est tout !

Que sont clientWidth, clinetHeight, winX, winY dans la fonction de conversion 2D en 3D ? s'il vous plaît aider.

Image vous avez un point à (100, 200) sur une surface de rendu 2D de taille 640x480.

clientWidth == 640
ClineHauteur == 480
winX == 100
winY == 200

j'ai un 4 2dlocator (animé au four) d'une rotation et d'un mouvement de géométrie plane simple.
j'ai besoin:
est ici une simple commande de script mel pour convertir mes 4 2dlocator en 1 localisateur 3d au centre de 4 localisateur 3d 2dlocator.created avec échelle, transformer x, y et rotation xyz.
est-ce possible dans maya, j'ai besoin de cette méthode pour placer mon polyplane dans ma vidéo de scène 3D. avec un mouvement d'échelle de rotation en 3D mais devant la couche vidéo projetée, aucun mouvement en z n'a besoin d'être associé au même espace d'écran que la sortie de la vidéo de rendu.
n'importe quelle idée n'importe quel lien n'importe quelle méthode n'importe quel script n'importe quel logiciel qui a fait cela
Aidez-moi, s'il vous plaît

Je travaille sur un scanner 3D. Je ne comprends pas comment convertir les coordonnées des pixels en coordonnées du monde réel.

Par exemple, j'ai un ensemble de données contenant uniquement les coordonnées (x, y) de certains points sur l'objet en termes de pixels, comment puis-je les convertir en unités du monde réel (c'est-à-dire cm ou mm) ?

Qu'est-ce que winx et winy dans la fonction ci-dessous? Est-ce juste la largeur et la hauteur de l'écran ?

fonction Point3D get3dPoint(Point2D point2D, int largeur,
hauteur int, Matrix viewMatrix, Matrix projectionMatrix) <

double x = 2.0 * winX / clientWidth - 1
double y = - 2,0 * winY / clientHeight + 1
Matrix4 viewProjectionInverse = inverse(projectionMatrix *
viewMatrix)

Point3D point3D = nouveau Point3D(x, y, 0)
return viewProjectionInverse.multiply(point3D)
>

Utilisez les commandes de la fenêtre du contrôleur pour modifier complètement le format de smash de mouvement. Les clients peuvent modifier le nombre, le poids, la gravité, l'épaisseur et l'effet de l'impact smash pour créer des looks toujours cool. Effets du mouvement 5


Utilisez des degrés d'angle visuel pour définir la taille et l'emplacement du stimulus. Cela dépend bien sûr de la distance à laquelle le participant s'assoit de l'écran ainsi que de l'écran lui-même, alors assurez-vous que cela est contrôlé et n'oubliez pas de modifier le paramètre dans Monitor Center si la distance de visualisation change.

Fréquence spatiale : cycles par degré

Nécessite : des informations sur la largeur de l'écran en cm et en pixels et la distance de vision en cm

Il existe en fait trois variantes : « deg », « degFlat » et « degFlatPos »

« degré » : La plupart des personnes utilisant des degrés d'angle visuel choisissent de faire l'hypothèse qu'un degré d'angle visuel couvre le même nombre de pixels dans toutes les parties de l'écran. Ce n'est pas vraiment vrai pour les écrans plats standard - un degré d'angle visuel au bord de l'écran couvre plus de pixels car il est plus éloigné de l'œil. Pour les excentricités modérées, l'erreur est faible (une erreur de 0,2 % dans le calcul de la taille à une excentricité de 3 degrés) mais augmente à mesure que les stimuli sont placés plus loin du centre de l'écran (une erreur de 2 % à 10 degrés). Pour la plupart des études, cette forme de calcul est préférée, car elle n'entraîne pas une apparence déformée des stimuli visuels, mais si vous avez besoin d'une plus grande précision à des excentricités éloignées, choisissez l'une des alternatives ci-dessous.

'degFlatPos' : Cela tient compte des écrans plats dans le calcul des coordonnées de position des stimuli visuels, mais laisse la taille et la fréquence spatiale non corrigées. Cela signifie qu'une grille de stimuli visuels régulièrement espacés apparaîtra déformée en position mais

'degFlat': Ceci corrige les calculs de degrés de planéité de l'écran pour chaque sommet de vos stimuli. Les stimuli carrés en périphérie deviendront donc plus espacés mais ils deviendront également plus gros et rhomboïdes dans les pixels qu'ils occupent.


Contenu

Les coordonnées des emplacements sont fournies à l'aide de deux ensembles de nombres sur un système de coordonnées cartésien simple. De cette façon, les emplacements peuvent être trouvés en utilisant est/nord (ou X,oui) paires. Par convention, la paire est généralement représentée par l'abscisse en premier, puis par l'ordonnée en second.

Par exemple, le sommet du mont Assiniboine (à 50°52′10″N 115°39′03″W  /  50.86944°N 115.65083°W  / 50.86944 -115.65083 ) dans la zone UTM 11 est représenté par 11U 594934 5636174 . D'autres conventions peuvent également être utilisées, telles qu'une référence de grille tronquée, [2] qui raccourcirait les coordonnées de l'exemple à 949-361 .

Fausse abscisse

Valeur linéaire ajoutée à toutes les coordonnées x d'une projection cartographique afin qu'aucune des valeurs de la région géographique cartographiée ne soit négative. Le point d'origine de chaque zone UTM est l'intersection de l'équateur et du méridien central de chaque zone. Pour éviter de traiter avec des nombres négatifs, le méridien central de chaque zone est fixé à 500 000 mètres à l'est.

Fausse ordonnée

La valeur linéaire ajoutée à toutes les coordonnées y d'une projection cartographique afin qu'aucune des valeurs de la région géographique cartographiée ne soit négative. l'ordonnée à l'équateur est fixée à 10 000 000 mètres donc aucun point n'a une valeur négative.


Mettre à jour

J'ai mis à jour la méthode ConvertToCartesian, de sorte qu'elle prenne la True Anomaly (nu) calculée à partir de la fonction ConvertToKeplerElements en entrée. Ensuite, il calcule l'anomalie excentrique (E), puis calcule l'anomalie moyenne (Mt) à partir de cela. Lorsque ConvertToCartesian est appelé dans les boucles suivantes, Mt est mis à jour avec le pas de temps pertinent. Ensuite, je calcule à nouveau E à partir du Mt mis à jour, puis je calcule nu à partir du E mis à jour. Cela résout la plupart des cas. Le problème est que parfois nu est calculé à 180 degrés de l'endroit où il devrait être, ce qui fait que le point de départ de l'orbite affichée est à 180 degrés.

Dans ma fonction ConvertToKeplerElements, selon les calculs, nu = 2pi - nu si r.v < 0. Cela se produit, par exemple, lorsque je définis les vecteurs r, v initiaux de telle sorte que le navire ne démarre ni au périapsis ni à l'apoapsis mais quelque part entre les deux. je sais que c'est correct, mais lorsque je calcule nu->E->nu, ce retournement à 180 degrés est perdu dans le calcul.

Voici les parties pertinentes de la méthode mise à jour ConvertToCartesian.

Voici le mauvais résultat que j'obtiens :


Vous avez déjà un compte? Se connecter ici.

Tom Allensworth,
Fondateur d'AVSIM Online

AVSIM est un service gratuit pour la communauté de simulation de vol. AVSIM est entièrement composé de bénévoles et tous les fonds versés à AVSIM servent directement à soutenir la communauté. Votre don ici aide à payer nos coûts de bande passante, notre financement d'urgence et d'autres frais généraux qui surviennent de temps en temps. Merci pour votre soutien!

Objectifs de don

Faites un don à notre objectif général annuel de collecte de fonds. Ce don maintient nos portes ouvertes et vous fournit un service 24 x 7 x 365. Votre don ici aide à payer nos coûts de bande passante, notre financement d'urgence et d'autres frais généraux qui surviennent de temps en temps. Nous réinitialisons cet objectif chaque nouvelle année pour l'objectif de l'année suivante.


5 CFR § 531.214 - Fixation de la rémunération lors de la promotion.

(un général. Une agence doit fixer le taux de salaire de base payable à un employé lors de sa promotion en suivant les règles de cette section, conformément à 5 U.S.C. 5334(b). La règle de promotion dans 5 U.S.C. 5334(b) et les règles d'application de cette section s'appliquent uniquement à un employé GS qui est promu d'un grade GS à un grade GS supérieur. Conformément au § 531.206, tout ajustement salarial général qui prend effet le même jour qu'une action de promotion doit être traité avant l'application des règles de la présente section.

(b) Conversion géographique. Lorsque le lieu de travail officiel d'un employé est déplacé vers un nouvel emplacement où des barèmes de rémunération différents s'appliquent, l'agence doit convertir l'employé au(x) barème(s) de rémunération et au(x) taux de rémunération de base applicables pour le nouveau lieu de travail officiel en fonction du poste de l'employé. enregistrer avant la promotion comme prévu au § 531.205 avant de traiter une action de promotion simultanée.

(c) Augmentation simultanée à l'intérieur de la classe. Lorsqu'un salarié a droit à une augmentation d'échelon ou à une augmentation d'échelon de qualité qui prend effet en même temps qu'une promotion, l'agence doit traiter cette augmentation avant de traiter l'action de promotion.

(1. Général. Une agence doit déterminer le taux de rémunération de base payable à un employé lors de sa promotion en utilisant la méthode standard du paragraphe (d)(3) du présent article ou la méthode alternative du paragraphe (d)(4) du présent article, sous réserve de la règle spéciale de l'alinéa (d)(5) du présent article pour les employés bénéficiant d'un taux retenu avant la promotion. Une décision quant à savoir si la méthode alternative est utilisée à la place de la méthode standard dépend des barèmes de rémunération qui s'appliquent à un employé avant et après la promotion, comme prévu au paragraphe (d)(2) de cette section. Dans ce paragraphe (d), les références au taux ou à la fourchette d'un employé « avant la promotion » désignent le taux ou la fourchette avant la promotion mais après toute conversion géographique requise par le paragraphe (b) de cette section.

(2) Détermination de la méthode applicable. Les règles suivantes régissent la détermination de la méthode de promotion à utiliser :

(i) Appliquer la méthode standard exclusivement si l'employé est couvert par les mêmes grilles de rémunération avant et après la promotion. Par exemple, un employé peut être couvert par le barème général et le même barème de taux de localité avant et après la promotion.

(ii) Appliquer la méthode alternative si l'employé est couvert par des barèmes de rémunération différents avant et après la promotion et si la méthode alternative produira un taux payable plus élevé lors de la promotion que la méthode standard. Par exemple, un employé peut être couvert après sa promotion par un barème de taux spécial qui ne s'appliquait pas à lui avant sa promotion, et la méthode alternative produira un taux plus élevé.

(iii) Appliquer la méthode standard dans toutes les autres circonstances, sauf qu'une agence peut, à sa seule et exclusive discrétion, appliquer la méthode alternative pour un employé couvert par des barèmes de rémunération différents avant et après la promotion même si la méthode produit un taux payable inférieur que la méthode standard, mais uniquement dans les conditions suivantes :

(A) L'agence détermine qu'il serait inapproprié d'utiliser la méthode standard sur la base d'une conclusion que le salaire plus élevé pour le poste avant la promotion n'est pas suffisamment lié aux connaissances et aux compétences requises pour le poste après la promotion et

(B) L'agence informe l'employé de sa décision d'utiliser la méthode alternative avant la date d'entrée en vigueur de la promotion.

(i) La méthode standard d'application de la règle de promotion est présentée dans le tableau suivant :

Règle de promotion - Méthode standard
Étape A Le cas échéant, appliquer la règle de conversion géographique du § 531.205 pour déterminer le(s) taux(s) et échelle(s) de salaire de base de l'employé en fonction de la position d'enregistrement de l'employé avant la promotion et le nouveau lieu de travail officiel, comme l'exige le paragraphe (b) de cette section. De plus, s'il y a lieu, fournir toute augmentation simultanée à l'intérieur du grade ou d'échelon de qualité, comme l'exige le paragraphe (c) de la présente section. Utilisez le(s) taux de salaire de base résultant(s) comme le(s) taux existant(s) en vigueur immédiatement avant la promotion en appliquant les étapes B et C.
Étape B Identifiez le taux GS existant de l'employé (ou taux de base spécial LEO) dans le grade avant la promotion, et augmentez ce taux de deux augmentations GS au sein du grade pour ce grade.
Étape C Déterminer le taux de rémunération de base payable (le plus élevé) pour l'échelon ou le taux déterminé à l'échelon B en appliquant tout paiement de localité ou supplément de taux spécial applicable au grade donné, en fonction de la position de l'employé avant la promotion et du lieu de travail officiel après la promotion. (Si le taux déterminé à l'étape B est supérieur au maximum de la fourchette, utilisez le même paiement de localité ou le même supplément de taux spécial qui s'applique aux tarifs à l'intérieur de la fourchette de taux.)
Étape D Identifiez la fourchette de taux applicable la plus élevée pour le poste d'enregistrement de l'employé après la promotion et trouvez le taux d'échelon le plus bas dans cette fourchette qui est égal ou supérieur au taux déterminé à l'étape C. Il s'agit du taux de salaire de base payable à l'employé lors de la promotion. (Si le taux identifié à l'étape C dépasse le maximum de la fourchette de taux identifiée à cette étape, le taux payable de l'employé est ce taux maximum, ou, si le taux actuel de l'employé est supérieur à ce taux maximum, un taux retenu inférieur à la partie 5 CFR 536 égal à ce taux existant.)

(ii) Exemple de méthode standard : Un employé GS-11, échelon 5, à Los Angeles est promu à un poste GS-12 à Kansas City. À Kansas City, un barème de taux spécial s'appliquerait au poste GS-11 de l'employé, mais à GS-12, aucune échelle de taux spéciale ne s'applique à la place, juste une échelle de taux de localité s'applique. Ainsi, des barèmes de rémunération différents s'appliquent à l'employé à Kansas City avant et après la promotion. L'agence détermine que la méthode standard produit un taux plus élevé que la méthode alternative parce que l'employé est couvert par un barème de taux spécial avant la promotion mais pas après la promotion. L'agence détermine également qu'elle n'invoquera pas la disposition d'exception en vertu du paragraphe (d)(2 )(iii). L'agence applique la méthode standard comme suit :

Étape A Appliquez la règle de conversion géographique pour déterminer les taux de rémunération de base pour le poste GS-11, échelon 5, à Kansas City. Les barèmes de rémunération applicables à l'employé à Kansas City sont le barème général, le barème de taux local applicable à Kansas City et le barème de taux spécial applicable au poste de l'employé à Kansas City.
Étape B À l'aide de l'annexe générale sous-jacente, augmentez le taux GS-11, échelon 5, de deux augmentations au sein de la classe, ce qui produit le taux GS-11, échelon 7.
Étape C Le taux de rémunération de base payable (le plus élevé) pour GS-11, échelon 7, est le taux spécial correspondant de GS-11, échelon 7, qui s'appliquerait au poste GS-11 à Kansas City.
Étape D La fourchette de taux applicable la plus élevée pour le poste GS-12 après la promotion est la fourchette de taux de localité GS-12 selon le barème de taux de localité de Kansas City. Trouvez le taux d'échelon le plus bas dans cette gamme qui est égal ou supérieur au taux spécial GS-11, échelon 7, de l'échelon C. Ce taux d'échelon est le taux payable du salaire de base lors de la promotion.

(i) L'autre méthode d'application de la règle de promotion, qui consiste à utiliser les barèmes de rémunération applicables avant la promotion, puis à convertir la rémunération en un barème différent applicable après la promotion, est présentée dans le tableau suivant :

Règle de promotion - Autre méthode
Étapes A, B, C Identique à la méthode standard du paragraphe (d)(3) de cette section.
Étape D Identifiez la fourchette de taux applicable la plus élevée pour le grade de l'employé après la promotion en fonction de l'examen de tout barème de rémunération qui s'appliquait au poste de référence de l'employé avant la promotion (après toute conversion géographique). (Ne tenez pas compte des barèmes de paie qui s'appliquent uniquement au nouveau poste de référence de l'employé après la promotion. Par exemple, si un barème de taux spécial particulier s'applique uniquement au poste de référence d'un employé après la promotion, ignorez ce barème en appliquant cette étape.) l'échelon le plus bas de l'échelle de taux applicable la plus élevée qui est égal ou supérieur au taux identifié à l'étape C. (Si le taux identifié à l'étape C dépasse le maximum de l'échelle de taux identifiée à cette étape, le taux payable de l'employé est ce taux maximum, ou, si le taux actuel de l'employé est supérieur à ce taux maximum, un taux retenu sous 5 CFR partie 536 égal à ce taux existant.)
Étape E Convertissez le taux d'échelon le plus bas identifié à l'étape D en un taux d'échelon correspondant (même échelon) dans la fourchette de taux applicable la plus élevée pour le nouveau poste de référence de l'employé après la promotion. This is the employee's alternate payable rate of basic pay upon promotion. (If the rate derived under step D was a retained rate, determine the alternate payable rate of basic pay as provided in paragraph (d)(4)(ii) of this section.)
Step F If the alternate payable rate identified in step E exceeds the payable rate resulting from the standard method in paragraph (d)(3) of this section, the employee is entitled to the alternate rate upon promotion. Otherwise, the employee is entitled to the payable rate derived under the standard method, except as provided in paragraph (d)(2)(iii) of this section.

(ii) In applying step E of the table in paragraph (d)(4)(i) of this section, if the rate derived under step D was a retained rate, compare the retained rate to the highest applicable rate range identified in step E. If the retained rate exceeds the maximum of that rate range, the retained rate continues and is the employee's alternate payable rate upon promotion. If the retained rate is below the rate range maximum, the employee's alternate payable rate upon promotion is the maximum rate of the range (step 10).

(iii) Example of alternate method: A GS-7, step 7, employee in Atlanta is promoted to a GS-9 position in Washington, DC. The promotion involves not only a change in grade but also a change in the employee's occupational series. In Washington, DC, no special rate schedule would apply to a GS-7 or GS-9 position in the old occupational series, but a special rate schedule does apply to the GS-9 position in the new occupational series. Thus, different pay schedules apply before and after promotion, and the alternate method would result in a higher rate than the standard method. As provided in paragraph (d)(2)(ii) of this section, the agency must apply the alternate method and compare the result to the result derived under the standard method, as follows:

Step A Apply the geographic conversion rule in § 531.205 to determine the rates of basic pay for the GS-7, step 7, position in Washington, DC. Based on the GS-7 position before promotion (including the old occupational series), the pay schedules applicable to the employee in Washington, DC, would be the General Schedule and the locality rate schedule applicable in Washington, DC.
Step B Using the underlying General Schedule, increase the GS-7, step 7, rate by two within-grade increases, which produces the GS-7, step 9, rate.
Step C The payable (highest) rate of basic pay for GS-7, step 9, is the corresponding GS-7, step 9, locality rate in Washington, DC.
Step D If the employee were promoted to a GS-9 position in the old occupational series, the highest applicable rate range for that GS-9 position after promotion would be the GS-9 locality rate range in Washington, DC. The GS-9, step 3, locality rate is the lowest step rate in that range that equals or exceeds the GS-7, step 9, locality rate from step C.
Step E Convert the GS-9, step 3, locality rate to the higher GS-9, step 3, special rate that applies to the employee's position after promotion (including the new occupational series). That GS-9, step 3, special rate is the payable rate of basic pay upon promotion.
Step F Assume that the standard method would have compared the GS-7, step 9, locality rate directly to the higher GS-9 range of special rates and produced a rate of GS-9, step 1. Since the rate produced by the alternate method (GS-9, step 3) is greater than the rate produced by the standard method, the result of the alternate method is used.

(5) If employee was receiving a retained rate before promotion.

(i) If an employee's existing payable rate of basic pay before promotion is a retained rate, apply the applicable promotion methods in paragraphs (d)(3) or (d)(4) of this section as if the employee were receiving the maximum rate of the employee's grade before promotion.

(ii) If the payable rate of basic pay after promotion determined under paragraph (d)(5)(i) of this section is greater than the employee's existing retained rate, the employee is entitled to that payable rate.

(iii) If the existing retained rate is greater than the rate determined under paragraph (d)(5)(i) of this section, the retained rate must be compared to the highest applicable rate range for the position after promotion, as provided in 5 CFR 536.304. The employee is entitled to the lowest step rate in the range that equals or exceeds the retained rate or, if the retained rate exceeds the range maximum, to the retained rate.

(6) If employee is promoted from GS-1 or GS-2. In applying the promotion rule to an employee who is promoted from step 9 or 10 of grade GS-1 or GS-2, the value of two within-grade increases is determined by doubling the within-grade increase between step 9 and 10 for the applicable grade.

(e) Temporary promotions. Pay is set for an employee receiving a temporary promotion on the same basis as a permanent promotion. Upon expiration or termination of the temporary promotion, pay is set as provided in § 531.215(c). If a temporary promotion is made permanent immediately after the temporary promotion ends, the agency may not return the employee to the lower grade instead, the agency must convert the employee's temporary promotion to a permanent promotion without a change in pay.

(f) Corrections of demotions. The promotion rule in this section may not be used in correcting an erroneous demotion. (See § 531.215(e).)


In your App Builder Field Settings, expand More Field Settings to customize these properties.

Accuracy (m) Option

Accuracy (m) allows you to specify how accurate the GPS location must be in meters for the location. When acquiring a location from satellites, the first points reported by the hardware can often be inaccurate.

By choosing a focus on accuracy, GoCanvas will reject any reported location coordinates until the desired accuracy is met or until the timeout expires.

Timeout (ms) Option

Timeout (ms) allows you to decide the maximum amount of time, in milliseconds, to wait for location coordinates. If it takes to long, and accuracy hasn't been met, the location will be reported.

You can change this by turning on the force accuracy option (see below).

Force Accuracy Option

If you choose Force Accuracy, if the mobile app doesn't get the accurate location before timing out, no location will be captured.


Voir la vidéo: Miten käynnistää tietokoneen näyttö? (Octobre 2021).