D'ailleurs avec la disposition que j'ai presentée tu peux aussi obtenir le chemin complet le plus court avec la methode de la droite dont j'avais parler...
Mais c'est un peu plus complexe
Déjà il faut commencer par delimiter l'hexagone qui je le rappelle est positionner par rapport à son centre... Edit: apres calcul on peut simplifier par un cercle, donc vous pouvez aller directement au passage en gras suivant
Donc on a dis que la distance d entre 2 centre etait de 1
Du coup on peut en deduire qu'un coté d'hexagone c'est
C=cos(30°)*0.5=0.43301270
De meme une diagonale
Di=C+tan(30°)=1.01036297
De çà on peut deduire les droite qui delimite l'hexagone:
Dd y=Xg+0.5
Dhd y=-(Di/2)t+(Xg-Yg+Di/2)
Dhg y=(Di/2)t+(Xg-Yg+Di/2)
Dg y=Xg-0.5
Dbd y=(Di/2)t+(Xg-Yg-Di/2)
Dbg y=-(Di/2)t+(Xg-Yg-Di/2)
et x=t t etant le parametre
Avec Xg et Yg les coordonnée du centre de l'hexagone
Bon j'espere que je me suis pas trompé dans le calcul. Bon bref là tu as ton hexagone delimitée
Il te suffit maintenant comme je disais de tracer la droite entre tes 2 points et de prendre tout les hexagones ou elle passe.
Mais le mieux de tout c'est que tu peux te permetre de simplifier les hexagones (enfin j'en suir à 99% selon les calcul que j'ai fait) par un simple cercle de rayon 0.5 et de centre G
Donc
Nous sommes sur l'hexagone A de coordonnée (a,b)
On desire se rendre sur l'hexagone B de coordonnée (c,d)
La droite peut s'ecrire ainsi:
x=(c-a)t'
y=(d-b)t' avec t' de 0 à 1 (pour que ce soit un segment et non une droite on pourrait meme affiner en ne prennat que les cases du chemin)
Donc du coup la case fait partie du chemin si:
sqrt(pow(Xg-(c-a)t,2)+pow(Yg-(d-b)t,2))=0.5 et t>0 et t<1
Alors le probleme me dira tu c'est que t est variable entre 0 et 1 et que c'est difficile à concevoir en mysql
Là je te repond tout à fait!
la seul solution que je vois c'est d'utilisé une table de t dans la bdd, qui sont tous tres raproché de 0.001 en 0.001 par exemple et l'utilisé pour simuler ce t variable (avec un Group by x,y pour pas avoir 5000 fois la meme case)
Mais il y a surement une autre solution.
En tout cas ce que je te presente là te sort tout de meme les hexagone dans l'ordre du chemin (si il y a un order by t).
A noter qu'il peut y avoir des doublons qui peuvent etre suprimer en utilisant Group by t (le probleme c'est que je l'utilise déjà)
Enfin bref je sais pas si tu as compris mais en tout cas çà me semble la methode la plus efficaces pour ton probleme
Mais c'est un peu plus complexe
Déjà il faut commencer par delimiter l'hexagone qui je le rappelle est positionner par rapport à son centre... Edit: apres calcul on peut simplifier par un cercle, donc vous pouvez aller directement au passage en gras suivant
Donc on a dis que la distance d entre 2 centre etait de 1
Du coup on peut en deduire qu'un coté d'hexagone c'est
C=cos(30°)*0.5=0.43301270
De meme une diagonale
Di=C+tan(30°)=1.01036297
De çà on peut deduire les droite qui delimite l'hexagone:
Dd y=Xg+0.5
Dhd y=-(Di/2)t+(Xg-Yg+Di/2)
Dhg y=(Di/2)t+(Xg-Yg+Di/2)
Dg y=Xg-0.5
Dbd y=(Di/2)t+(Xg-Yg-Di/2)
Dbg y=-(Di/2)t+(Xg-Yg-Di/2)
et x=t t etant le parametre
Avec Xg et Yg les coordonnée du centre de l'hexagone
Bon j'espere que je me suis pas trompé dans le calcul. Bon bref là tu as ton hexagone delimitée
Il te suffit maintenant comme je disais de tracer la droite entre tes 2 points et de prendre tout les hexagones ou elle passe.
Mais le mieux de tout c'est que tu peux te permetre de simplifier les hexagones (enfin j'en suir à 99% selon les calcul que j'ai fait) par un simple cercle de rayon 0.5 et de centre G
Donc
Nous sommes sur l'hexagone A de coordonnée (a,b)
On desire se rendre sur l'hexagone B de coordonnée (c,d)
La droite peut s'ecrire ainsi:
x=(c-a)t'
y=(d-b)t' avec t' de 0 à 1 (pour que ce soit un segment et non une droite on pourrait meme affiner en ne prennat que les cases du chemin)
Donc du coup la case fait partie du chemin si:
sqrt(pow(Xg-(c-a)t,2)+pow(Yg-(d-b)t,2))=0.5 et t>0 et t<1
Alors le probleme me dira tu c'est que t est variable entre 0 et 1 et que c'est difficile à concevoir en mysql
Là je te repond tout à fait!
la seul solution que je vois c'est d'utilisé une table de t dans la bdd, qui sont tous tres raproché de 0.001 en 0.001 par exemple et l'utilisé pour simuler ce t variable (avec un Group by x,y pour pas avoir 5000 fois la meme case)
Mais il y a surement une autre solution.
En tout cas ce que je te presente là te sort tout de meme les hexagone dans l'ordre du chemin (si il y a un order by t).
A noter qu'il peut y avoir des doublons qui peuvent etre suprimer en utilisant Group by t (le probleme c'est que je l'utilise déjà)
Enfin bref je sais pas si tu as compris mais en tout cas çà me semble la methode la plus efficaces pour ton probleme