Problème avec des coordonnées
Résolumamiemando Messages postés 33499 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 janvier 2025 - 29 août 2024 à 14:42
- Problème avec des coordonnées
- Coordonnées gps - Guide
- Trouver un lieu avec coordonnées gps - Guide
- Envoyer coordonnées gps par sms - Accueil - Téléphones
- Convertir coordonnées x y en latitude longitude excel - Forum Programmation
- Convertir des coordonnées xy - Forum GPS
5 réponses
Modifié le 28 août 2024 à 16:24
Bonjour,
Le code est complexe à lire, je vais m'arrêter à quelques points de détail.
- Tes imports sont redondants, simplifie par
import matplotlib.pyplot as plt
- La méthode inside() de vérification du point dans le polygone est brutale, matplotlib contient déjà de quoi vérifier ça ! Par le fait ça allège quelques fonctions.
- Importe Path de matplotlib et remplace def inside(Poly, p): par
from matplotlib.path import Path ... def inside(Poly, p): path = Path(Poly) return path.contains_points([p])[0]
- Remplace ta big double boucle for par :
path_for_oups = Path(list(zip(A, B))) for i in range(nc): if not path_for_oups.contains_point((A[i], B[i])): print("OUPS!", A[i], B[i])
Tiens au jus !
Modifié le 28 août 2024 à 16:42
Je pense que ton polygone est concave, tout simplement.
Les points 0 et 9 ne sont pas du même côté de la droite passant par les points 2 et 3
Les points 0 et 10 ne sont pas du même côté de la droite passant par les points 3 et 4
Les points 0 et 12 ne sont pas du même côté de la droite passant par les points 5 et 6
Les points 0 et 3 ne sont pas du même côté de la droite passant par les points 11 et 12
Les points 1 et 9 ne sont pas du même côté de la droite passant par les points 2 et 3
Les points 1 et 10 ne sont pas du même côté de la droite passant par les points 3 et 4
Les points 1 et 12 ne sont pas du même côté de la droite passant par les points 5 et 6
Les points 1 et 3 ne sont pas du même côté de la droite passant par les points 11 et 12
Les points 2 et 10 ne sont pas du même côté de la droite passant par les points 3 et 4
Les points 2 et 12 ne sont pas du même côté de la droite passant par les points 5 et 6
Les points 3 et 8 ne sont pas du même côté de la droite passant par les points 1 et 2
Les points 3 et 12 ne sont pas du même côté de la droite passant par les points 5 et 6
Les points 4 et 8 ne sont pas du même côté de la droite passant par les points 1 et 2
Les points 4 et 9 ne sont pas du même côté de la droite passant par les points 2 et 3
Les points 4 et 12 ne sont pas du même côté de la droite passant par les points 5 et 6
Les points 5 et 13 ne sont pas du même côté de la droite passant par les points 6 et 7
Les points 5 et 14 ne sont pas du même côté de la droite passant par les points 7 et 8
Les points 5 et 1 ne sont pas du même côté de la droite passant par les points 9 et 10
Les points 5 et 2 ne sont pas du même côté de la droite passant par les points 10 et 11
Les points 6 et 14 ne sont pas du même côté de la droite passant par les points 7 et 8
Les points 6 et 1 ne sont pas du même côté de la droite passant par les points 9 et 10
Les points 7 et 1 ne sont pas du même côté de la droite passant par les points 9 et 10
Les points 8 et 13 ne sont pas du même côté de la droite passant par les points 6 et 7
Les points 8 et 1 ne sont pas du même côté de la droite passant par les points 9 et 10
Les points 8 et 2 ne sont pas du même côté de la droite passant par les points 10 et 11
Les points 10 et 0 ne sont pas du même côté de la droite passant par les points 8 et 9
Les points 11 et 0 ne sont pas du même côté de la droite passant par les points 8 et 9
Les points 12 et 0 ne sont pas du même côté de la droite passant par les points 8 et 9
Les points 12 et 1 ne sont pas du même côté de la droite passant par les points 9 et 10
Les points 12 et 2 ne sont pas du même côté de la droite passant par les points 10 et 11
Les points 13 et 0 ne sont pas du même côté de la droite passant par les points 8 et 9
Les points 13 et 2 ne sont pas du même côté de la droite passant par les points 10 et 11
Les points 13 et 3 ne sont pas du même côté de la droite passant par les points 11 et 12
Les points 14 et 12 ne sont pas du même côté de la droite passant par les points 5 et 6
Les points 14 et 3 ne sont pas du même côté de la droite passant par les points 11 et 12
Modifié le 29 août 2024 à 14:42
Bonjour,
Je te propose cette réécriture plus simple de ce programme, qui j'espère, fait ce que tu veux en réutilisant les remarques faites dans les messages #2 et #5. J'ai renommé quelques variables afin qu'il soit plus clair et décomposé le code en fonction pour qu'il soit plus lisible. J'ai retiré la partie csv car elle n'est pas au centre de la question, mais libre à toi de la remettre.
Si j'ai bien compris, le but est de trouver, étant donnée une enveloppe polygonale (blue_points), de trouver tous les points contenus dans cette enveloppe (green_points) étant donné un pas discret arbitraire (step).
from matplotlib import pyplot as plt from matplotlib.path import Path def inside(poly, p): path = Path(poly) return path.contains_points([p])[0] def quantize(x, step): return (x // step) * step def make_dataset(dataset_id): if dataset_id == 1: red_xs = [325025, 325000, 325000, 325025] red_ys = [2077495, 2077495, 2077520, 2077520] blue_xs = [324987.612, 324987.549, 324987.525, 324986.697, 324984.445, 324989.878, 324994.957, 325001.832, 325006.195, 325015.463, 325019.355, 325035.482, 325037.5, 325045.742, 325060.603, 324987.2] blue_ys = [2077487.5, 2077487.897, 2077518.372, 2077523.137, 2077527.005, 2077537.484, 2077536.422, 2077536.602, 2077536.922, 2077536.433, 2077536.6, 2077536.314, 2077537.5, 2077537.5, 2077487.5, 2077487.5] elif dataset_id == 2: red_xs = [325010.01, 325015.120, 325015.2, 325010.210] red_ys = [2077560.012, 2077560.05, 2077555.21, 2077555.045] blue_xs = [324989.345, 324987.133, 324987.502, 325037.452, 325035.977, 324989.345] blue_ys = [2077586.246, 2077553.622, 2077537.955, 2077537.402, 2077589.933, 2077586.246] else: raise ValueError("Invalid dataset_id") return (red_xs, red_ys, blue_xs, blue_ys) def find_discrete_points_in_hull(xs, ys, step): min_x = int(quantize(min(xs), step)) + step min_y = int(quantize(min(ys), step)) + step max_x = int(quantize(max(xs), step)) + step max_y = int(quantize(max(ys), step)) + step hull = list(zip(xs, ys)) return [ (px, py) for px in range(min_x, max_x, step) for py in range(min_y, max_y, step) if inside(hull, (px, py)) ] def my_plot(red_xs, red_ys, blue_xs, blue_ys, green_xs, green_ys): plt.plot(blue_xs, blue_ys) plt.axis("equal") plt.grid(True) plt.title("Coordonnées planifiées") plt.xlabel("Axe des X") plt.ylabel("Axe des Y") plt.scatter(green_xs, green_ys, color="g") plt.scatter(red_xs, red_ys, color="r") def main(): step = 5 for dataset_id in (1, 2): (red_xs, red_ys, blue_xs, blue_ys) = make_dataset(dataset_id) green_points = find_discrete_points_in_hull(blue_xs, blue_ys, step) (green_xs, green_ys) = zip(*green_points) my_plot(red_xs, red_ys, blue_xs, blue_ys, green_xs, green_ys) plt.show() main()
Bonne chance
28 août 2024 à 15:28
bonjour,
Si tu as une idée de ce que fait ce programme, pourrais-tu l'expliquer?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question29 août 2024 à 07:18
Bonjour,
merci beaucoup luckydu43 pour vos observations merci a vous aussi yg_be effectivement il est concave, je veux utiliser shapely et la methode avec matplotlib voir
29 août 2024 à 12:24
Si on utilise cette nouvelle version de la fonction inside, il faut revoir la manière dont l'enveloppe E est construire :
On peut alors se débarrasser :
Bonne chance