多角形の凸性判定
長方形(0, 0)、(4, 0)、(4, 3)、(0, 3)は凸で、すべての角が反時計回りの同じ向きに曲がります。矢じり形(0, 0)、(3, 1)、(0, 2)、(1, 1)は左右の曲がりが混ざるため、へこみのある凹多角形です。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
多角形の凸性判定は、計算幾何学の基本的な問いへの答えを返します。順序付きの直交座標頂点リングが与えられたとき、すべての内角が百八十度以下に保たれ、形状が内側にくぼまないかを確かめます。地籍区画を検証する測量者、衝突ハルを設計するゲーム開発者、ジオフェンス多角形を整えるGISチーム、凸制約を課すCADエクスポート、単純多角形の演習を採点する授業ツールはいずれも、本格的な幾何ライブラリを立ち上げずに決定的な可否の答えを必要とします。本機能は順序付き頂点リストを受け取り、閉じたリングを一度走査し、各連続辺ペアの二次元外積を比較します。零でない外積がすべて同じ符号を共有するとき、すべての角で同じ向きに曲がり、多角形は凸です。符号が混在すれば少なくとも一つの劣角があり、多角形は凹です。外積が零の箇所は共線頂点を示し、凸性を壊さずに許容されます。
連続辺の外積が凸性をどう決めるか
順序付き頂点を V の零から V の n マイナス一まで番号付けし、呼び出し側が始点を繰り返さなくても、最後の頂点から最初の頂点への辺があるものとしてリングを閉じます。前の頂点 A、現在の頂点 B、次の頂点 C について、A から B、B から C への外向きベクトルを作ります。
それらの二次元外積はスカラー z で、(B.x マイナス A.x) かける (C.y マイナス B.y) マイナス (B.y マイナス A.y) かける (C.x マイナス B.x) に等しくなります。z の符号は B での曲がりの向きです。
平面を y 上向き・x 右向きとすると、正は左折(境界の反時計回り)、負は右折(時計回り)、零は A・B・C が共線であることを意味します。単純多角形が凸である必要十分条件は、零でない曲がりがすべて同じ符号を共有することであり、これは各内角が百八十度以下で境界の回転方向が逆転しないことと同値です。
正と負の曲がりが混在すれば、リングのどこかに劣角があり、多角形は凹です。呼び出し側がすでにリングを閉じていた場合に先頭点の末尾重複を落とす正規化を一度行ったあと、アルゴリズムは頂点数に対して厳密に O(n) です。
凸かどうかの確認が役立つ場面
地図・GIS パイプラインは、凸窓へのクリッピング、複雑な領域の分解、劣角頂点を拒否するソルバへの投入など、凸入力を前提とするアルゴリズムの前に多角形の凸性判定を使います。ゲームやシミュレーションのエンジンは設計者が作った衝突メッシュを検証し、一箇所のくぼみが後で分離軸法や GJK の前提を壊さないようにします。
CAD や製造のエクスポートは、カッターへ形状を送る前にブランクやサポート多角形へ凸制約を課します。教育プラットフォームは「この多角形は凸か」という設問を、共線の辺中間頂点を教科書の曲がり定義どおりに一貫処理する決定的オラクルで採点し、目視に頼りません。検証失敗は残高を消費しません。
活用例
GIS ジオフェンスと区画の検証
クリッピング・バッファ・面積処理が凸多角形を前提とするパイプラインの前に、凹の地籍・ジオフェンスリングを拒否またはフラグ付けします。
ゲーム衝突ハルの検査
設計者が作った 2D 衝突多角形を検証し、凸性依存の衝突アルゴリズムが実行時にくぼんだハルを受け取らないようにします。
授業・試験の自動採点
「この多角形は凸か」という設問を、教科書の曲がり方向定義に一致する決定的な外積オラクルで採点します。
よくある質問
多角形が凸かどうかをどう判定しますか?
順序付き頂点を {x, y} または [x, y] の組で(少なくとも三点)送ってください。
連続する頂点の一部が共線の場合は?
外積が零でも問題ありません。辺の途中の共線点だけでは凸性は崩れません。左折と右折が混在するときだけ凹多角形と判定されます。
頂点順(時計回りと反時計回り)は重要ですか?
一貫した向きであればどちらでも構いません。凸のときは orientation を clockwise または counterclockwise、曲がりが食い違うときは mixed と報告します。
頂点が三つ未満のときは?
多角形の凸性判定には少なくとも三頂点が必要で、無効入力は課金されません。
判定結果には「はい・いいえ」のほかに何が分かりますか?
輪の回る向きが分かります。反時計回り、時計回り、凹形のときの混在、すべての点が一直線上にあるときの共線のいずれかです。実際に曲がった回数と、まっすぐ通過した頂点の数も示します。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/polygon-is-convex \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"vertices":[{"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/polygon-is-convex", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"vertices": [
{
"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/polygon-is-convex",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"vertices": [
{
"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/polygon-is-convex", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"vertices":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":3},{"x":0,"y":3}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"vertices":[{"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/polygon-is-convex", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"vertices": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.polygon_is_convex",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
連続辺の外積が凸性をどう決めるか
外積がすべて零なら頂点は一直線上にあり、面積がなく、本エンドポイントは凸包をでっち上げず is_convex false と orientation collinear を返します。
入力契約・応答形・エラーの振る舞い
少なくとも三点の順序付き配列です。各点は有限の x と y を持つオブジェクト(または lon と lat の別名)でも、二要素配列 [x, y] でも構いません。先頭と同一の末尾頂点は自動で除去されるので、GeoJSON 形式の閉じたリングも授業用の開いたリストも両方使えます。例として正方形 (0,0)、(4,0)、(4,3)、(0,3) は反時計回りの凸です。スケッチが必要なら真偽値を自前の描画コードと組み合わせてください。必須フィールド vertices を一つ持つ JSON 本体を POST してください。別名 points、polygon、coords も同じ意味で受け付けるため、既存の GIS ペイロードを名前変更なしで渡せます。その正規化後に頂点が三つ未満、配列でないペイロード、欠損座標、非有限数は invalid_input で失敗し、課金されません。成功時の本体には真偽値 is_convex、正規化後の頂点数 n、counterclockwise・clockwise・mixed・collinear のいずれかである orientation、零でない曲がりの数 turn_count、共線の数 zero_turns、外積の恒等式を再掲する formula 文字列、リング順の {x, y} オブジェクトとしてエコーした vertices が含まれます。凹の矢尻 (0,0)、(3,1)、(0,2)、(1,1) は曲がり符号が混在し is_convex false を返します。本エンドポイントは凸性の分類のみを行い、プロット・ハル・三角形分割は出力しません。
多角形の凸性 API が価値を生む場面
実装は純粋な parse の tier A であるため、成功した各呼び出しはモデルトークンも外向きネットワークもなく、公開されている基本料金 $0.002 です。リングを控えめに保ち、テストで is_convex と orientation を固定すれば、ジオフェンス・授業チェック・エッジワーカー向けに再現可能な凸性ラベルを得られ、自前で計算幾何のフルスタックを出荷する必要はありません。
技術的な質問
多角形の凸性判定の料金は?
ブラウザ上のツールは無料です。API リクエストは成功した呼び出しごとに前払い KIT 残高から $0.002 です。無効入力は課金されません。