座標から多角形の内角を計算
この多角形内角計算ツールは、単純多角形の順序付きデカルト座標を受け取り、各頂点の内側の角度を求めます。凸多角形と凹多角形の両方に対応しており、くぼんだ頂点では 180 度を超える優角も正しく算出できます。結果では入力した頂点の順序を保ち、すべての測定値を度数で示し、周回方向と理論上の内角の合計も返します。図形の確認、座標データの検証、描画機能の試験、再現可能な自動処理にご利用いただけます。
無料で実行
境界順に多角形の頂点を入力します
有限の数値 x、y を持つオブジェクトとして、3 個以上の頂点を指定してください。頂点は多角形の境界に沿って途切れずに並べ、時計回りまたは反時計回りのどちらかに統一します。最後に最初の点を重ねて入力する必要はありません。末尾から先頭への辺は自動的に閉じられます。座標は平面上のデカルト座標として扱われ、作図単位、投影座標系のメートル、ピクセルなど、一貫した線形尺度を利用できます。曲面上の経度・緯度としては解釈されません。有効な入力は単純多角形である必要があります。隣り合う頂点の一致、同じ点の重複、面積が 0 の図形、隣接していない辺どうしの交差や接触は認められません。境界が自分自身に重なると内角が一意に決まらないためです。検証に失敗した場合は、不正な図形にもっともらしい角度を返さず、該当する頂点または辺の問題を示します。
凸角、凹角、優角の結果を読み取ります
各頂点について、現在の点から直前と直後の点へ向かう二つのベクトルを作ります。その内積と外積から、局所的な角度と曲がる向きを判定します。また、符号付き面積により、多角形全体が時計回りか反時計回りかを確認します。局所的な曲がり方と周回方向を組み合わせることで、通常の凸頂点と、内側が優角になる凹頂点を区別できます。そのため、凸な長方形では 90 度が 4 個返り、内側へくぼんだ頂点では 180 度を超える値が返ることがあります。angles_deg 配列は入力頂点と完全に同じ順序で並び、インデックス 0 は常に最初の点を表します。計算結果は、実用的な精度を保ちながら浮動小数点の不要な末尾を除くため、小数第 10 位に丸められます。不正な重なりを作らない一直線上の境界点では、180 度になる場合があります。winding は周回方向だけを表します。
合計を確認して結果を適切に使います
頂点数が n の単純多角形では、凸か凹かにかかわらず、内角の合計は (n − 2) × 180 度です。total_sum_deg はこの不変の理論値を直接示し、vertex_count は n を示します。この合計は、CAD から書き出した図形、デジタル化した輪郭、学習用の問題、独自の描画アプリから座標を取り込む際の簡単な整合性確認に役立ちます。個別の角度は丸められているため、表示値を別途合計すると、浮動小数点演算によるごく小さな差が生じることがあります。厳密な合計には total_sum_deg をお使いください。同じ順序の座標からは常に同じ JSON が生成され、ネットワーク、乱数、現在時刻には依存しません。対話的な確認はブラウザーで無料実行でき、自動処理へ組み込む場合は1回 $0.002 で API を呼び出せます。座標は同じ平面座標系にそろえ、地球の曲率が結果に影響する地理データは、あらかじめ適切な座標系へ投影してください。
活用例
描画ツールを検証する
順序付き多角形パスを編集した後、各頂点の角度と理論上の合計を照合できます。
凹形状を調べる
すべての多角形を凸または正多角形と仮定せず、くぼんだ頂点の優角を特定できます。
座標問題を採点する
座標リストで与えられた多角形について、頂点ごとの再現可能な角度と期待される合計を生成できます。
よくある質問
凹多角形にも対応していますか?
はい。周回方向と局所的な曲がり方を使い、必要な頂点では 180 度を超える内側の優角を返します。
最後に最初の頂点をもう一度入力しますか?
いいえ。閉じる辺は暗黙に補われ、最初の頂点を繰り返すと重複として拒否されます。
緯度と経度をそのまま使えますか?
平面近似で十分な場合に限られます。正確な地理図形が必要な場合は、先に適切なデカルト座標系へ投影してください。
多角形が拒否されるのはなぜですか?
頂点が 3 個未満、有限でない座標、点の重複、長さ 0 の辺、面積 0、隣接しない辺の交差などが主な原因です。
API の利用料金はいくらですか?
API は1回 $0.002 です。同じ決定論的な計算をブラウザーでもご利用いただけます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/polygon-interior-angles \
-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-interior-angles", {
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-interior-angles",
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-interior-angles", 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-interior-angles", 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_interior_angles",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |