あなたが探しているのは射影スケールです。これを計算で行う最も簡単な方法は、同次座標を使用し、Vが「右に無限に遠い」長方形(下の最初の図のような)を取り、この長方形を台形にマッピングする射影変換を見つけることです。 2番目の写真。長方形の頂点は(0 | 0)、(0 | d1)、(b5 | d1)、(b5 | 0)であり、台形の対応する頂点は(0 | 0)、(0 | d1)、( b5 | d5)、(b5 | 0)。
これらは4つの点であり、そのうち3つは同一線上にないため、この変換の一意の行列(スケーリングまで)Mを見つけることができます。いくつかの計算の後、この行列は次のようになります。
[d1*b5,0,0]
[0,b5*d5,0]
[d1-d5,0,b5*d5]
たとえば、座標b3とd3を見つけたい場合は、この行列に線の中央の点の同次座標、つまりベクトル(0.5 * b5、d1,1)^ Tを掛けると、次のようになります。点の同次座標(b3 | d3)。これは、非均質化、つまり最初の2つの成分を3番目の成分で割ることによってユークリッド座標に変換できます。
一般に、2つの点(b1 | d1)と(bn | dn)があり、このような射影スケールでの間にあるn-2の等距離点の座標を知りたい場合は、次のように座標biとdiを計算できます。 (あなたの場合、もちろんnは5になります):
let M := matrix [[d1*bn, 0, 0], [0, bn*dn, 0], [d1-dn, 0, bn*dn]]
let v := ((i-1)/(n-1)*bn, d1, 1)
let (x,y,z) := M*v
let bi := x/z and di := y/z
ご覧のとおり、これはこれらの射影的に等距離の点の座標を計算するための単純なアルゴリズムであり、任意の数の点にうまく一般化されます。
閉じた式が必要な場合は、biとdiを次のように直接計算できます。
let bi := (bn*d1*(i-1))/(dn*n+(d1-dn)*i-d1)
let di := d1*dn*(n-1)/(dn*n+(d1-dn)*i-d1)