Point dans polygone
Le point (1, 1) est à l'intérieur du rectangle aux coins (0, 0), (4, 0), (4, 3) et (0, 3) : un rayon lancé vers la droite croise son contour une fois, et un nombre impair signifie dedans. Le sens horaire comme antihoraire convient. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Tout se passe dans votre navigateur : gratuit, sans envoi de vos données.
Un test point-dans-polygone répond à une question de base de géométrie computationnelle : étant donné une position de requête et une forme fermée définie par un anneau ordonné de sommets, cette position tombe-t-elle à l’intérieur de la forme ? Levé, produits cartographiques, masques de collision de jeux, géofences logistiques et laboratoires de géométrie en classe ont tous besoin de la même réponse déterministe plutôt que d’un croquis à main. Ce vérificateur implémente l’algorithme classique de ray casting pair-impair sur des coordonnées planes : un demi-rayon horizontal est lancé depuis le point de test vers l’infini positif, chaque arête du polygone est testée pour un croisement propre, et la parité du compte de croisements décide intérieur versus extérieur. Les points qui tombent exactement sur une arête ou un sommet sont traités comme intérieurs et marqués d’un indicateur de bord pour que les consommateurs d’ensemble fermé n’aient pas besoin d’un second passage. Le polygone est fermé implicitement — vous n’avez pas à répéter le premier sommet à la fin — et les sommets peuvent être fournis comme objets avec champs x et y ou comme tableaux de deux éléments. Lorsque moins de trois sommets sont fournis la requête échoue avec une erreur de validation claire, car un polygone a besoin d’au moins un triangle.
Comment fonctionne le test de ray casting pair-impair
Partir d’un point de requête fini de coordonnées x et y et d’une liste ordonnée d’au moins trois sommets plans formant un polygone simple fermé lorsque les sommets consécutifs sont reliés et que le dernier rejoint le premier. L’algorithme n’exige pas d’ordre horaire ou antihoraire ; les deux orientations sont valides sous la règle pair-impair. Depuis le point de requête, imaginez un rayon horizontal qui ne voyage qu’à droite, jamais à gauche.
Parcourez chaque arête du polygone et décidez si cette arête croise le rayon. Les arêtes horizontales sont ignorées pour ne pas créer de doubles comptes ambigus. Lorsqu’une arête chevauche la hauteur du rayon — une extrémité strictement au-dessus du y de requête et l’autre non — le x exact de l’intersection est calculé avec un paramètre linéaire le long de l’arête.
Si le x de requête se trouve strictement à gauche de cette intersection, l’arête contribue un croisement ; si l’intersection coïncide avec la requête dans une tolérance numérique minuscule, le point est classé comme sur le bord. Après traitement de toutes les arêtes, un compte impair de croisements signifie intérieur et un compte pair extérieur, l’argument classique de parité de la courbe de Jordan spécialisé à un rayon horizontal. Les coordonnées doivent être finies ; NaN et Infinity sont rejetés.
Où les tests point-dans-polygone apparaissent dans le travail réel
Les produits logistiques et de livraison demandent si un fix GPS de coursier tombe dans un polygone de quartier avant d’offrir un tarif par zone, et ont besoin d’une réponse déterministe qui ne dérive pas entre l’aperçu carte du navigateur et le serveur. Jeux et médias interactifs utilisent des masques de collision alignés ou libres définis comme anneaux de sommets et testent positions de joueur ou projectile à chaque image sans tirer une pile SIG lourde.
Les modules de géométrie computationnelle en classe enseignent le ray casting, l’intuition du théorème de la courbe de Jordan et les cas limites flottants ; un seul oracle de confiance qui renvoie à la fois le drapeau inside et le compte brut de croisements aide les étudiants à vérifier les devoirs étape par étape. Outils d’urbanisme et cadastraux classent des points d’échantillon contre empreintes de bâtiments ou polygones de zonage lors de revues de conception précoces quand les bases topologiques complètes ne sont pas encore connectées.
Si vous avez plus tard besoin de périmètre de polygone, d’aire de polygone, de géodésie grand cercle, de trous multipolygone avec la règle de winding non nulle ou de confinement sphérique sur l’ellipsoïde WGS84, traitez-les comme intentions de recherche et atterrissages séparés plutôt que de surcharger cette page du vérificateur plan point-dans-polygone.
Cas d’usage
Appartenance à une géofence pour la logistique
Classez des points GPS ou de clic carte contre zones de livraison et polygones de quartier avec un drapeau inside déterministe partagé par aperçus navigateur et tarification backend.
Tests de hit jeux et interface
Testez si un curseur, joueur ou projectile se trouve dans un masque polygonal libre sans importer une bibliothèque SIG complète côté client.
Questions fréquentes
Quel algorithme utilise ce vérificateur point-dans-polygone ?
Ray casting pair-impair : un demi-rayon horizontal depuis le point de requête compte les croisements avec les arêtes du polygone ; impair signifie intérieur, pair extérieur.
Que se passe-t-il si le polygone a moins de trois sommets ?
Un polygone a besoin d’au moins trois sommets ; un segment ou un point unique n’est pas un anneau valide pour le confinement.
L’ordre des sommets compte-t-il (horaire vs antihoraire) ?
Les deux orientations fonctionnent sous la règle pair-impair. L’ordre doit rester séquentiel autour du bord ; mélanger les sommets produit une forme différente (souvent auto-intersectante).
Que se passe-t-il si le point est exactement sur le bord ?
Un point situé exactement sur un côté ou un sommet compte comme intérieur, et le résultat précise qu'il est sur la limite : un repère posé sur la ligne de clôture est donc considéré comme inclus.
Faut-il répéter le premier sommet à la fin ?
Non. Le polygone est fermé automatiquement : le dernier sommet est relié au premier. Il suffit de donner au moins trois sommets dans l'ordre, chacun sous forme d'une paire x et y.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/geo/point-in-polygon \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"x":1,"y":1,"polygon":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":3},{"x":0,"y":3}]}'const res = await fetch("https://api.kit.forhosting.com/geo/point-in-polygon", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"x": 1,
"y": 1,
"polygon": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/point-in-polygon",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"x": 1,
"y": 1,
"polygon": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/point-in-polygon", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"x":1,"y":1,"polygon":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":3},{"x":0,"y":3}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"x":1,"y":1,"polygon":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":3},{"x":0,"y":3}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/point-in-polygon", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"x": 1,
"y": 1,
"polygon": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.point_in_polygon",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
Comment fonctionne le test de ray casting pair-impair
Les impacts de bord court-circuitent vers intérieur avec on_boundary vrai pour que les marqueurs dessinés sur la clôture comptent comme contenus. Tout le pipeline est une arithmétique flottante déterministe : pas de graines aléatoires, pas d’horodatages, pas d’appels réseau et pas de dérive de modèle, de sorte que des entrées identiques produisent toujours un JSON identique. Les anneaux dégénérés de moins de trois sommets sont rejetés avec invalid_input plutôt que de traiter en silence un segment comme polygone.
Ce que vous envoyez et ce que vous obtenez en retour
Envoyez le point de test comme champs numériques obligatoires x et y, et le polygone comme tableau obligatoire sous le champ polygon avec au moins trois sommets. Des objets point imbriqués optionnels sont pris en charge pour les clients qui empaquettent déjà la requête comme une seule structure. Lorsque le tableau polygon a une longueur zéro, un ou deux, la requête échoue avec un message indiquant qu’un test point-dans-polygone a besoin d’au moins trois sommets, pour que les appelants corrigent la géométrie au lieu de deviner. Chaque sommet peut être un objet avec x et y ou un tableau de deux nombres ; les alias vertices et points sont aussi acceptés pour l’anneau. Champs manquants, chaînes non numériques, NaN et Infinity échouent avec invalid_input et ne sont pas facturés. En cas de succès la réponse inclut inside en booléen, on_boundary en booléen, un objet point nettoyé, le tableau polygon nettoyé, n comme nombre de sommets, crossings comme l’entier de croisements rayon-arête utilisé par le test de parité, method fixé à ray_casting et rule à even_odd. Contrôles de fumée typiques : un carré unitaire avec requête à un virgule un qui est intérieur, une requête loin hors du carré qui est extérieur, et un triangle avec un point sur un côté qui est intérieur avec on_boundary vrai. Le tarif des appels API réussis est la base publiée de $0.002 par élément ; les échecs de validation ne consomment pas le solde prépayé.
Où les tests point-dans-polygone apparaissent dans le travail réel
Comme cette capacité est un moteur de parse pur, le tarif API est la base publiée de $0.002 par élément réussi et la validation échouée ne consomme pas de solde.
Cas d'intégration
Géométrie computationnelle en classe
Démontrez ray casting, parité et cas limites de bord avec un JSON stable incluant les comptes de croisements pour vérification pas à pas.
Questions techniques
Les points sur l’arête comptent-ils comme intérieur ?
Oui. Si la requête tombe sur une arête ou un sommet dans une tolérance numérique minuscule, inside est vrai et on_boundary est vrai.
Quel est le coût ?
L’outil navigateur est gratuit et s’exécute localement. Les requêtes API utilisent le solde KIT prépayé à $0.002 par élément réussi ; l’entrée invalide n’est pas facturée.