7

おそらくこれを投稿するのに適切な場所ではありませんが、他に投稿する場所がわかりません。

i には 5 本の線 (d1 -> d5) があり、3D 視点で互いに均等に分散されています。(a) 角度、(d1) および (b5) の値があります。jqueryで(b2、b3、b4、d2、d3、d4、d5)を計算する必要があります。

ここに画像の説明を入力

私はd5を計算することができます:

d5 = d1 - ( b5 * Math.tan(a))

しかし、b2、b3、b4 の計算方法がわかりません。(d1 は 4 つの同一のセグメントに分割されます) 任意の助けをいただければ幸いです。

4

2 に答える 2

2

あなたが探しているのは射影スケールです。これを計算で行う最も簡単な方法は、同次座標を使用し、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)
于 2013-03-08T04:39:35.977 に答える
0

ここに画像の説明を入力

最初に、三角形全体d1 -> v -> c (左側の垂直辺)の隣接辺の長さを計算する必要があります。

tan(Θ) = opposite / adjacent
opposite * tan(Θ) = adjacent
adjacent = opposite * tan(Θ)
adjacent = d1 * tan(a)

次に必要なことは、 vからの各ラインがラインd1に到達したときに地面からどれだけ離れているかを知ることです。変数sがすべての分割で同じであり、N 個の分割セグメント (この場合は 3) を想定すると、カウンターはiであり、1 から始まりNまで進みます。

opposite(i) = i * (d1 / N)

次に、 vから各マーカーsまでの線の角度が必要です。

tan(Θi) = opposite / adjacent
Θi = arctan(opposite / adjacent)
Θi = arctan(opposite(i) / adjacent)
Θi = arctan((i * (d1 / N)) / (d1 * tan(a)))

いくつかのジオメトリ/三角関数を使用して、 d1から点cを通りd5の頂点に向かう角度は (90° - a)であると言えます。この角度を a'とします。

a' = 90° - a

サインの法則は次のことを示しています。

A' / sin(a') = opposite(i) / sin(b')

オレンジ色の正方形の寸法を取得するのに助けが必要なので、A' について解きます。

A' = (opposite(i) * sin (a')) / sin(b')

b' = ( a + Θi ) なので、これは次のようになります。

A' = (opposite(i) * sin (90° - a)) / sin(a + Θi)

同じことが適用されますが、オレンジ色の三角形のhを解決します (図を参照):

h / sin(90°-Θi) = A' / sin(90°)
h = (A' * sin(90°-Θi)) / sin(90°)    
b2 = h

すべてをまとめて(コピー/貼り付けの間違いがないことを願っています)、単純化せずに:

b2 = (((( i * (d1 / N)) * sin (90° - a)) / sin(a + Θi)) * sin(90° - arctan((i * (d1 / N)) / (d1 * tan(a))))) / sin(90°)    

次に、 iの値ごとにリンス/繰り返しを実行し、コードに変換します (実行したはずですが、疲れすぎています) :)

于 2013-03-08T04:34:21.853 に答える