座標点を六角形グリッドセルへ変換
平面座標を、正六角形グリッド上でその点を含むセルへ変換します。点の座標と六角形のサイズを指定し、必要に応じてグリッドの向きと原点も設定できます。結果は整数の軸座標である列と行として返され、地図、ゲーム、空間集計、プロシージャル配置、近傍計算にそのまま利用できます。変換には立方体座標による丸めを使用するため、辺や頂点に近い点も一貫して割り当てられます。すべてのセルを走査したり、ポリゴン形状を生成したりする必要はありません。
無料で実行
点を特定する前にグリッドを定義します
正六角形グリッドで点をセルに割り当てるには、3種類の情報が必要です。最初に、グリッドと同じ座標系で平面上の x 座標と y 座標を指定してください。次に、size を六角形の中心から任意の頂点までの距離として設定します。これは外接円の半径であり、六角形全体の幅や高さ、向かい合う辺の間隔、セル中心間の距離ではありません。最後に向きを選択します。pointy グリッドは上下に頂点があり、flat グリッドは上下に水平な辺があります。既定値は pointy です。初期状態では、軸座標がゼロ、ゼロのセルの中心は平面座標のゼロ、ゼロに一致します。グリッドを移動している場合は origin_x と origin_y を指定してください。原点によって変わるのは配置だけであり、縮尺、向き、インデックス体系は変化しません。座標値とサイズには、ピクセル、メートル、投影地図の単位など、必ず共通の単位を使用します。距離が一貫した平面グリッドが必要な場合は、経度と緯度をあらかじめ適切な投影座標へ変換してください。
軸座標の結果と丸め方を理解します
返される列と行は軸座標であり、六角形グリッドの資料では一般に q と r と表記されます。六角形グリッドでは6方向へ移動できますが、軸座標では2本の整数軸だけを使用します。省略される3番目の立方体座標は、最初の2座標の和を負にした値として決まるため、距離、隣接セル、リング、範囲を簡潔に計算できます。内部では、選択した向きに応じて点を小数の軸座標へ変換します。次に立方体座標へ移し、その制約を保ったまま丸めて、整数の軸座標ペアへ戻します。この手順は重要です。表示される2軸を別々に丸めると、斜めの境界付近で誤ったセルが選ばれる場合があるためです。共有される辺や頂点の真上にある点は、幾何学的には複数の閉じたポリゴンに属するので、セル割り当てには同値の場合の規則が必要です。この計算では、JavaScript の数値丸めと固定された成分補正順序によって決定論的に選択します。セル内部の点には一意の包含セルを返し、厳密な境界上では再現可能な標準セルを返します。
空間システムでセルのインデックスを活用します
点から軸座標の列と行を得ると、個々の六角形ポリゴンを保存したり判定したりせずに、多数の観測値をグループ化できます。ゲームではポインター位置を盤面のセルへ変換でき、可視化では投影済みのイベントを区画ごとに集計でき、プロシージャル生成ではこの座標ペアを安定したタイルキーとして利用できます。インデックスと一緒に元のグリッド定義も保持してください。サイズ、向き、原点のいずれかが変わると、同じ列と行でも異なる物理領域を表します。複数の点を処理するときは、全項目に同一のグリッド設定を使い、たとえば列、コンマ、行を連結したキーでレコードをまとめます。負のインデックスも正常です。向きに応じて、軸原点の左側、上側、または下側のセルを示します。処理時間は点ごとに一定で、グリッド全体の広さには左右されません。人工的な境界も設けないため、有限の盤面にも概念上無限のグリッドにも使えます。描画時は、列と行を長方形のピクセル座標として扱わず、対応する軸座標から平面座標への式でセル中心または頂点を求めてください。
活用例
ポインターから六角形タイルを選択
マウス、スタイラス、タッチの位置を、盤面、エディター、戦略ゲームで使う軸座標セルへ変換します。
投影済み地図データを区画化
平面地図上の点を安定した六角形区画へ割り当ててから、観測値の集計、着色、要約を行います。
プロシージャル世界のデータを索引化
位置を整数の列・行インデックスに変換し、生成地形、キャッシュ、シミュレーション状態のキーとして使用します。
よくある質問
size は何を表しますか?
Size は六角形の中心から任意の頂点までの距離です。正六角形では辺の長さにも等しくなります。
pointy と flat の向きはどう違いますか?
Pointy の六角形は上下に頂点があり、flat の六角形は上下に水平な辺があります。向きによって座標変換式が異なります。
列や行は負の値になりますか?
はい。軸座標はゼロ、ゼロのセルから全方向へ広がるため、負のインデックスも通常の結果です。
点がセル境界の真上にある場合はどうなりますか?
立方体座標の丸めで決定論的な同値規則を適用し、その辺または頂点を共有するセルの1つを返します。
経度と緯度を直接入力できますか?
数値としては入力できますが、計算は平面座標系を前提とします。距離や面積の一貫性が必要な場合は、先に地理座標を投影してください。
API リクエストの料金はいくらですか?
API リクエスト1回あたり $0.002 です。同じ決定論的な計算をブラウザー内でも実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/hex-grid-cell \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"x":18,"y":9,"size":10}'const res = await fetch("https://api.kit.forhosting.com/geo/hex-grid-cell", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"x": 18,
"y": 9,
"size": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/hex-grid-cell",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"x": 18,
"y": 9,
"size": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/hex-grid-cell", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"x":18,"y":9,"size":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"x":18,"y":9,"size":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/hex-grid-cell", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"x": 18,
"y": 9,
"size": 10
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.hex_grid_cell",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |