点の多角形内外判定
点(1, 1)は、角が(0, 0)、(4, 0)、(4, 3)、(0, 3)の長方形の内側にあります。右へ伸ばした半直線が輪郭と1回交わり、奇数回なら内側と判定します。時計回りでも反時計回りでも使えます。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
処理はブラウザ内で完結します。ファイルは送信されません。無料でご利用いただけます。
点の多角形内外判定は計算幾何の基本的な問いに答えます。照会位置と、順序付き頂点リングで定義された閉じた形があるとき、その位置は形の内部にあるか。測量、地図製品、ゲームの衝突マスク、物流のジオフェンス、授業の幾何ラボは、手描きスケッチではなく同じ決定的な答えを必要とします。本判定器は平面座標上の古典的な偶奇レイキャスティングを実装します。判定点から正の無限遠へ水平半直線を投げ、各多角形辺の真の交差を調べ、交差回数の偶奇で内と外を決めます。辺や頂点にぴったり乗る点は内部として扱い、境界フラグを立てるため、閉集合の利用側は二度手間が不要です。頂点が3未満だと検証エラーで失敗します。多角形には少なくとも三角形が必要だからです。
偶奇レイキャスティングの仕組み
有限な照会点(座標x,y)と、連続頂点を結び最後を最初に戻すと単純閉多角形になる少なくとも3点の順序付き平面頂点リストから始めます。アルゴリズムは時計回り・反時計回りの指定を求めず、偶奇規則ではどちらも有効です。照会点から、右だけへ進み左へは行かない水平レイを想像します。
多角形の各辺を歩き、その辺がレイと交差するかを判定します。水平辺は曖昧な二重カウントを避けるため無視します。辺がレイの高さにまたがるとき(一端が照会yより厳密に上で他端はそうでない)、辺に沿った線形パラメータで交点の正確なxを計算します。
照会xがその交点より厳密に左なら交差1回、交点がごく小さな数値許容内で照会と一致すれば境界上と分類します。全辺処理後、交差が奇数なら内部、偶数なら外部です。これは水平レイに特化した古典的ジョルダン曲線の偶奇論法です。
座標は有限でなければならず、NaNとInfinityは拒否されます。
実務で点の多角形内外判定が現れる場面
物流・配送製品はゾーン別料金を出す前に配達員のGPS固定が近隣多角形内かを問い、ブラウザ地図プレビューとサーバーでずれない決定的な答えを必要とします。ゲームやインタラクティブメディアは頂点リングで定義した軸揃えまたは自由形の衝突マスクを使い、重いGISスタックなしで毎フレームプレイヤーや弾の位置を調べます。
授業の計算幾何はレイキャスティング、ジョルダン曲線の直感、浮動小数の端ケースを教え、insideフラグと生の交差数の両方を返す信頼できるオラクルが宿題の段階確認を助けます。都市計画や地籍ツールは完全な位相DB接続前の初期設計レビューで、建物フットプリントや用途地域多角形に対する標本点を分類します。
後で多角形周囲長・面積、大圏測地、非零巻数規則のマルチポリゴン穴、WGS84楕円体上の球面包含が必要なら、この平面点多角形判定ページを過負荷にせず別の検索意図とランディングとして扱ってください。
活用例
物流向けジオフェンス所属
配送ゾーンと近隣多角形に対しGPSや地図クリック点を分類し、ブラウザプレビューとバックエンド料金で共有する決定的なinsideフラグを得ます。
ゲームとUIのヒットテスト
完全なGISライブラリをクライアントに入れずに、カーソル・プレイヤー・弾が自由形多角形マスク内かを判定します。
よくある質問
この点の多角形内外判定はどのアルゴリズムですか?
偶奇レイキャスティングです。照会点からの水平半直線が多角形辺との交差を数え、奇数なら内部、偶数なら外部。
多角形の頂点が3未満の場合は?
多角形には少なくとも3頂点が必要で、線分や一点は包含用の有効なリングではありません。
頂点順(時計回り対反時計回り)は重要ですか?
偶奇規則ではどちらの向きも有効です。境界に沿った連続順は必須で、頂点を混ぜると別形状(多くは自己交差)になります。
点がちょうど辺の上にある場合はどうなりますか?
辺や頂点の上にある点は内側として扱われ、境界上にあることも結果に示されます。境界線の上に置いた目印も、範囲に含まれるものとして判定されます。
最初の頂点を最後にもう一度入れる必要はありますか?
いいえ。多角形は自動的に閉じられ、最後の頂点は最初の頂点とつながります。xとyの組で表した頂点を、順番どおりに3つ以上入力するだけです。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
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)リクエスト例
{
"x": 1,
"y": 1,
"polygon": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.point_in_polygon",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
多角形は暗黙に閉じられ、末尾で最初の頂点を繰り返す必要はなく、頂点はx・yフィールドのオブジェクトまたは二要素配列で渡せます。無料のブラウザツールと有料APIは一つの純粋な同型関数を共有し、デモ・宿題確認・自動パイプラインが同じ座標で分岐しません。
偶奇レイキャスティングの仕組み
境界ヒットはon_boundary真で内部へ短絡し、フェンス線上のマーカーも内包とみなします。全パイプラインは決定的浮動小数点演算で、乱数種・壁時計・ネットワーク・モデルドリフトがなく、同一入力は常に同一JSONを生みます。頂点が3未満の退化したリングは、線分を多角形として黙って扱うのではなくinvalid_inputで拒否されます。
送る内容と返ってくる内容
照会を単一構造にまとめるクライアント向けに任意の入れ子pointもサポートします。polygon配列の長さが0・1・2のときは、少なくとも3頂点が必要というメッセージで失敗し、呼び出し側が推測ではなく幾何を直せます。授業デモや地図試作には無料ブラウザフォームを、一括ジオフェンス分類や回帰フィクスチャにはスクリプトから同一契約を呼び出します。判定点を必須数値フィールドxとy、多角形を少なくとも3頂点の必須配列polygonとして送ってください。各頂点はx・yオブジェクトまたは二数配列でよく、リングにはverticesとpointsの別名も受け付けます。欠落フィールド、非数値文字列、NaN、Infinityはinvalid_inputで失敗し課金されません。成功時はbooleanのinsideとon_boundary、整形済みpoint、整形済みpolygon配列、頂点数n、偶奇判定に使ったレイ辺交差整数crossings、method=ray_casting、rule=even_oddを返します。代表的な煙テストは、単位正方形で1,1が内部、遠く外が外部、辺上の三角形点が内部かつon_boundary真です。成功APIの料金は公開ベース$0.002/項目で、検証失敗は前払い残高を消費しません。
実務で点の多角形内外判定が現れる場面
本機能は純粋なparseエンジンのため、API料金は成功項目あたり公開ベース$0.002で、検証失敗は残高を消費しません。
連携の活用例
授業での計算幾何
段階検証用に交差数を含む安定JSONで、レイキャスティング・偶奇・境界端ケースを示します。
技術的な質問
辺上の点は内部に数えますか?
はい。照会がごく小さな数値許容内で辺または頂点上ならinsideは真、on_boundaryも真です。
費用はいくらですか?
ブラウザツールは無料でローカル実行です。APIは成功項目ごとに前払いKIT残高から$0.002で、無効入力は課金されません。