Bonjour à toutes et tous,
je souhaite écrire un programme affichant une carte 3D (pour un jeu qui sort en septembre ;-)
mais ce jeu n'affiche que les distances entre les étoiles donc je cherche à calculer leurs coordonnées
je peux déterminer les coordonnées des 3 premiers points (dans un repère que j'aurai fixé), mais je ne trouve pas la formule pour calculer les coordonnées du 4ème point
j'ai compris que cette formule va donner 2 solutions (2 points de part et d'autre du plan déterminé par les 3 premiers points), mais je peux m'en accommoder
une fois ces 4 premiers points de références calculés, la partie mathématique du problème sera résolue (j'ai trouvé la formules de calcul des coordonnées x,y,z des points suivants à partir des distances avec les 4 premiers points calculés).
j'ai essayé gogole et le duck-duck, mais je ne trouve que des formules de calcul de la hauteur de tétraèdres réguliers (ce qui ne sera jamais mon cas)…
est-ce qu'il y a dans le coin un(e) matheux(se) passionné(e) de jeux spatiaux pour me décrire ce calcul ou pour me mettre sur la piste ?
# Quoi?
Posté par GG (site web personnel) . Évalué à 2.
Je ne comprends pas ton problème.
Quelles distances? Entre quoi et quoi?
Pourquoi cette histoire de tétraèdre dans ton cas?
Et si tu as des formules mathématiques que tu as trouvées, complète ton message, ça va aider.
Bon courage
Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html
[^] # Re: Quoi?
Posté par pralines . Évalué à 2. Dernière modification le 08 août 2023 à 16:44.
désolé, je suis tellement dans mon truc que je n'ai pas donné beaucoup de contexte…
j'ai la distance en année lumière entre des étoiles, et je cherche à calculer les coordonnées x,y,z de ces étoiles afin d'afficher une carte galactique
j'ai une formule (trop longue pour être écrite ici) qui calcule les coordonnées d'un point à partir des distances avec 4 autres points dont les coordonnées sont connues
ma difficulté est de calculer les coordonnées de ces 4 premiers points (formant un tétraèdre irrégulier) qui vont me servir de référence
pour les coordonnées des 3 premiers points, pas de problème, j'ai ce qu'il faut comme formules trigo
pour le calcul des coordonnées du 4ème point je sèche, d'où l'appel à l'aide
EDIT : c'est un projet perso pour des joueurs
Envoyé depuis mon Archlinux
[^] # Re: Quoi?
Posté par pralines . Évalué à 1.
EDIT 2 : il semble que je doive chercher du côté du "true range multilateration" dans un espace cartésien à 3 dimensions
Envoyé depuis mon Archlinux
[^] # Re: Quoi?
Posté par GG (site web personnel) . Évalué à 2.
Peut être que tu auras des pistes sur leur forum…
https://pioneerspacesim.itch.io/pioneer
Si ça se trouve, ils ont déjà été confronté à ton problème.
Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html
[^] # Re: Quoi?
Posté par pralines . Évalué à 1. Dernière modification le 08 août 2023 à 21:10.
je ne connaissais pas
merci
Envoyé depuis mon Archlinux
[^] # Re: Quoi?
Posté par Barnabé . Évalué à 1.
Ce que tu nous dit, (ou au moins ce que j'en comprend), c'est:
J'ai une formule qui calcule les coordonnées d'un point à partir des distances avec 4 autres points dont les coordonnées sont connues,
je voudrais une formule qui calcule les coordonnées d'un point à partir des distances avec 3 autres points dont les coordonnées sont connues.
Du coup, as tu des infos supplémentaires sur le 4e point qui permettraient de calculer ses coordonnées à partir des distances à 3 autres points ?
[^] # Re: Quoi?
Posté par pralines . Évalué à 1. Dernière modification le 09 août 2023 à 11:15.
pour le 4ème point (comme pour tous les suivants), je connais uniquement la distance avec les 3 autres points (dont les positions sont connues)
donc, au mieux, le calcul va me donner 2 positions possibles (il faudra que je décide laquelle est la bonne, au dessus ou bien au dessous du plan déterminé par les 3 premiers points)
pour plus de détail, cf ma réponse à un autre commentaire plus bas
edit : je sais qu'il aurait fallu que je poste un schéma pour illustrer tout ça…
Envoyé depuis mon Archlinux
# comprends toujours pas
Posté par Jean-Baptiste Faure . Évalué à 4.
Si tu as 4 étoiles A,B,C et D et que tu sais calculer les coordonnées de A, B et C, qu'est-ce qui t'empêche de calculer de la même façon ceux de B, C et D (ou de n'importe quel autre triplet extrait de ce groupe de 4 étoiles) ?
[^] # Re: comprends toujours pas
Posté par pralines . Évalué à 2. Dernière modification le 09 août 2023 à 10:54.
la seule info dont je dispose est la distance entre les étoiles, je dois construire une référence/origine (en partie par des choix, en partie par des calculs)
pour me simplifier le travail, je décide que les 3 premières étoiles sont dans un plan du repère :
- point 1 en (x=0,y=0)
- point 2 en (x=0,y=distance avec le point 1)
- point 3 calculé
(si je ne me plante pas complètement : arcos() pour calculer les angles à partir des longueurs des arêtes du triangle, puis sin() ou cos(), je sais plus, pour calculer les x,y du point 3
mais la 4ème étoile ne sera jamais dans le même plan que les 3 premières, ce qui implique de calculer en 3D
mais je pense avoir trouvé une formule de calcul de l'intersection de 3 sphères (true range multilateration dans un espace cartésion 3d),
ce calcul va me donner 2 positions possibles pour le point 4 : 1 au dessus du plan des 3 premières étoiles et 1 au dessous de ce plan, il faudra que je décide laquelle est la bonne
ces 4 points calculés vont me servir de référence pour le calcul de tous les points suivants (pour autant que je dispose de leurs distances avec ces 4 positions connues), même méthode, mais avec 4 sphères
enfin, c'est ce que j'espère, ça fait longtemps que je suis sorti de l'école, j'étais vraiment mauvais en maths et en plus je pense qu'une partie de ces calculs n'étaient pas au programme de mon cursus (la trigo oui, mais pas le reste)…
désolé si ces explications sont confuses (ou pire, erronées), je ne peux pas mieux expliquer ce que je comprends à peine ;-)
Envoyé depuis mon Archlinux
[^] # Re: comprends toujours pas
Posté par bing . Évalué à 4.
De ce que j’ai compris il n’a aucune coordonnée. Seulement les distances entre les étoiles. Il veut construire une carte à partir de ça.
C’est possible mais probablement très compliqué ; j’en étais pas convaincu au départ mais j’ai une piste, qu’il faudrait valider et qui demande un sérieux background en math, plus précisément en algèbre linéaire.
L’idée est d’utiliser quatre étoiles (choisies avec précaution…) qui seront nos points Ces étoiles forment un repère d'origine et d'axes les vecteurs
Par construction est la -ième composante des coordonnées des points . Autrement dit les coordonnées des points dans sont (0,0,0), (1,0,0), (0,1,0), (0,0,1).
Facile. :D
L’arnaque c’est que n’est pas orthonormé et qu’on peut rien en faire en l’état. Pour poursuivre il faut trouver une métrique . Pour ceux qui ne savent pas ce que c’est : c’est une manière de définir un produit scalaire (et donc une distance), différent de celui que vous avez appris à l’école (qui est le produit scalaire canonique). La métrique se calcule dans le référentiel comme un tableau de 3×3 (c’est un tenseur). Le tenseur est symétrique : .
La diagonale est triviale : . Où est la distance entre deux points. De manière plus générique : ce qui nous donne un système de 6 équations à 6 inconnues au départ, avec la diagonale triviale, il reste 3 équations à 3 inconnues et vu la simplicité des coordonnées il y a probablement une astuce pour les résoudre analytiquement. Pour bien faire, il faut s’assurer que est bien défini positif (numériquement j’ai peur que ça ne soit pas garanti).
Une fois la métrique acquise, on n’est pas au bout de nos peines…
Il faut trouver un repère orthonormé (au sens de ) ; on utilise l’algorithme de Gram-Schmidt : en partant des vecteurs et en pensant à bien calculer les projections au moyen de . On aboutit donc à une base vectorielle qui sert à former le repère orthonormé d’origine identique à celle de . On a trivialement la matrice de passage associée , qui est une matrice carré donc chaque colonne est un des vecteurs de la base trouvée.
Pour finir, il va falloir adapter, au moyen de la métrique , la trilatération pour calculer les coordonnées d’une étoile quelconque dans le repère (visuellement parlant il s’agit non plus de trouver l’intersection de sphères, mais d’ellipsoïdes).
Les coordonnées dans s’obtiennent par la multiplication matricielle .
# Intersection de sphères et changement de repère.
Posté par GaMa (site web personnel) . Évalué à 6.
Intersection de 3 sphères.
On a donc 3 étoiles A, B, C.
Choisissons un repère que nous arrange bien tel que :
A: (0, 0, 0)
B: (1, 0, 0)
C: (K, L, 0)
Nos trois étoiles sont dans le même plan X/Y et B est alignée sur X
Soit D: (x, y, z)
Si on connais
AD
,BD
,CD
(Les distances entre A et D, B et D, …), D est a l'intersection de 3 sphères de centre A, B, C et de rayonAD
,BD
etCD
. Donc:AD
²BD
²CD
²On trouve facilement que x² - (x-1)² =
AD
²-BD
² => X = (AD
²-BD
² + 1)/2On peut "simplifier" les équations en :
- y² + z² =
AD
² + x² = M (par que ça simplifie les écritures)- (y-L)² + z² =
CD
² - (x-K)² = NDonc que y² - (y-L)² = M - N => y = (M - N + L²)/2L
Et donc que z² =
AD
² - x² - y².Donc deux solutions pour z, ce qui est cohérent avec ce qu'on attendait (D est au dessus ou en dessous du plan)
Changement de repère.
"C'est bien gentil les intersections de trois sphères mais mes 3 étoiles connues, elles ont pas ces coordonnées" tu vas me dire.
Et je te répondrais: "On s'en fout, on applique une matrice de changement de repère pour être dans le repère qui nous intéresse (facilite la vie), on résout notre problème, et on applique la matrice inverse pour avoir notre solution dans notre repère d'origine."
Du coup la question, c'est "Mais qu'elle est cette matrice de changement de repère ?".
On va devoir la calculer (mais je vais pas le faire ici, j'ai pas vraiment le temps je t'avoue :)) mais en gros:
- C'est une matrice 4x4
- C'est la composition des transformations élémentaires suivante:
. Translation de -(Ax, Ay, Az) pour se "placer A en zéro"
. Rotation de l'angle ABX, avec pour axe la normale au plan ABX => ça va pivoter notre repère pour placer l'étoile B sur l'axe X
. Rotation de l'angle ACY, avec pour axe la normale au plan ACY (=X) => ça va pivoter notre repère pour placer l'étoile C sur le plan XY
. Un changement d'échelle de 1/AB pour placer B en coordonnée 1 sur X
Je te conseille fortement d'utiliser des lib de transformations matricielles dans ton langage favori, tu n'as probablement pas envie de réimplémenter tout ça.
Matthieu Gautier|irc:starmad
[^] # Re: Intersection de sphères et changement de repère.
Posté par pralines . Évalué à 1. Dernière modification le 09 août 2023 à 17:28.
pour ce qui est du repère, j'avais prévu de faire comme tu dis, mais je vais pouvoir me simplifier grandement le travail car les 4 premières étoiles que je pense pouvoir choisir dans le jeu existent aussi IRL et leur coordonnées sont connues (Sol, Sirius, Tau Ceti, Alpha Centauri), donc pas de changement de repère après coup :-)
merci tout de même pour toutes tes informations
Envoyé depuis mon Archlinux
[^] # Re: Intersection de sphères et changement de repère.
Posté par GaMa (site web personnel) . Évalué à 2.
Le changement de repère n'est pas là parce que tu connais pas les coordonnées, il est là pour simplifier les calculs.
Si tu veux t'en passer tu vas avoir des équations de ce style:
DA
²DB
²DC
²Et là, à résoudre c'est pas facile du tout.
(Après tu peux faire les opérations
changement de répère
, résolution,changement de repère inverse
sur le papier et trouver les formules finales, que tu appliques après dans ton programme)Matthieu Gautier|irc:starmad
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.