2枚レンズ系の像位置計算ツール
この計算ツールは、一般的な近軸光学の符号規約に従い、離して配置された2枚の薄レンズを通る光を追跡します。まず第1レンズが作る像を求め、その位置を第2レンズに対する符号付き物体距離へ変換して、最終像を計算します。両方のレンズを基準にした位置、全横倍率、実像か虚像か、正立か倒立かを結果として表示します。距離の単位はすべてメートルで、焦点距離には凸レンズと凹レンズのどちらも指定できます。
無料で実行
2枚のレンズを共通の座標系で指定します
各薄レンズの符号付き焦点距離、元の物体から第1レンズまでの正の距離、レンズ間の正の距離を入力してください。凸レンズの焦点距離は正、凹レンズの焦点距離は負です。この計算では第1レンズを座標ゼロ、第2レンズをレンズ間隔の座標に置き、光は第1レンズから第2レンズへ進むものとします。したがって、元の物体は第1レンズの入射側にある実物体です。すべての長さをメートルで統一するため、暗黙の単位変換はなく、出力された位置をそのまま比較できます。薄レンズおよび近軸近似が成り立つことが前提です。レンズの厚さは無視し、2枚は同じ光軸上にあり、光線は光軸となす角が小さいものとします。このモデルは、授業の光線図、光学台の概略配置、一次光学設計に適しています。一方、実機で影響が大きい厚肉レンズの主平面、収差、開口絞り、波長によるガラス特性の変化までは扱いません。
中間像を第2段の計算へ引き継ぎます
最初の段階では第1レンズに薄レンズの式を適用し、符号付き像距離を求めます。次に、その像の位置と第2レンズの位置を比較します。第2レンズに対する符号付き物体距離は、レンズ間隔から第1像距離を引いた値です。中間像が第2レンズの左側にあれば、この距離は正となり、第2レンズには実物体が入射します。第1レンズだけなら第2レンズより先で光が結ぶ場合、距離は負になります。このとき第2レンズは収束中の光を受けるため、物体は虚物体です。この符号の変化こそ、2枚のレンズ系を独立した単レンズ計算2回として扱えない重要な点です。その後、第2レンズにも同じ薄レンズの式を適用します。最終像距離が正なら第2レンズの射出側にできる実像、負なら入射側にある虚像です。さらにレンズ間隔を加え、第1レンズから測った最終座標も表示します。
像位置、倍率、特異な条件を読み取ります
第2レンズを基準とする最終像距離は、スクリーン、センサー、観察面を第2光学素子からどこに置くか決める際に利用できます。機械図面の原点が第1レンズにある場合は、第1レンズ基準の最終位置をご利用ください。全横倍率は、2段の結像で生じる倍率の積です。絶対値はこの理想モデルにおける像と物体の大きさの比を表し、符号は向きを示します。負なら元の物体に対して倒立、正なら正立です。実像と虚像の区別は符号付き最終像距離に基づき、向きとは別の性質です。厳密な条件によっては有限の像位置が存在しません。第1レンズの焦点面に物体があると射出光は平行になり、第2レンズの焦点面に物体があると最終像は無限遠になります。本ツールは、JSONで扱えない無限大を返さず、有限位置を求められない入力として通知します。焦点距離ゼロ、正でない幾何学的距離、有限でない値、中間像が第2レンズ面と完全に一致する退化条件も受け付けません。
活用例
リレーレンズ対の後方にセンサーを置く
対物レンズとリレーレンズを通った後の符号付きセンサー位置を概算し、詳細な光学モデルへ進む前の配置を確認できます。
物理の光線図を確認する
2枚レンズの問題について、中間物体の符号規約、最終像位置、向き、全倍率を検算できます。
凸レンズと凹レンズの組み合わせを試す
焦点距離の符号とレンズ間隔により、第2レンズが受ける物体が実物体か虚物体かどう変わるか比較できます。
よくある質問
どの符号規約を使用しますか?
1/f = 1/do + 1/diを使用します。実物体と射出側の実像の距離は正、虚物体と虚像の距離は負です。
どちらかのレンズを凹レンズにできますか?
はい。凹レンズには負の焦点距離、凸レンズには正の焦点距離を入力してください。
第2物体距離が負になるのはなぜですか?
第1レンズだけなら像が第2レンズより先にできる場合、第2レンズは虚物体に対応する収束光を受けるためです。
第1レンズ基準の最終位置とは何ですか?
第1レンズをゼロ、第2レンズを正のレンズ間隔の座標に置いたときの最終像の座標です。
像が無限遠になる場合はどうなりますか?
無限大は有限の物理的位置でも有効なJSON数値でもないため、無効な入力としてエラーを返します。
APIでの計算料金はいくらですか?
APIによる計算1回の料金は$0.002です。ブラウザー版も同じ決定論的な式を使用します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/optics/two-lens-system-image \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"focal_length_1":0.1,"focal_length_2":0.2,"object_distance":0.3,"lens_separation":0.5}'const res = await fetch("https://api.kit.forhosting.com/optics/two-lens-system-image", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"focal_length_1": 0.1,
"focal_length_2": 0.2,
"object_distance": 0.3,
"lens_separation": 0.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/optics/two-lens-system-image",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"focal_length_1": 0.1,
"focal_length_2": 0.2,
"object_distance": 0.3,
"lens_separation": 0.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/optics/two-lens-system-image", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"focal_length_1":0.1,"focal_length_2":0.2,"object_distance":0.3,"lens_separation":0.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"focal_length_1":0.1,"focal_length_2":0.2,"object_distance":0.3,"lens_separation":0.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/optics/two-lens-system-image", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"focal_length_1": 0.1,
"focal_length_2": 0.2,
"object_distance": 0.3,
"lens_separation": 0.5
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "optics.two_lens_system_image",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |