4

次の3つのポイント、、があり、次のABC示すようになっているとします。

ここに画像の説明を入力してください

ポイントは常に垂直オフセットに従ってソートされるため、最上部のポイントは常にAです。BとCが同じy座標を持つ場合があります。

点Dのx座標を見つけようとしています。点A.yC.yで補間することにより、DのY座標を見つけることができます(B.y / (C.y - A.y))。次の式を使用して補間を行っています(C ++の場合)

float linearInterpolation(float a, float b, float t)
{
    return a + (t * (b - a));
}

つまり、D.y = linearInterpolation(A.y, C.y, (B.y - A.y) / (C.y - A.y))

要約すると、私の質問は次のとおりです。どうすれば見つけることができますD.xか?

ありがとう

-

答え:

明確にするために、提案されて機能したソリューションは次のとおりです。

D.x = A.x + (B.y - A.y) * (C.x - A.x) / (C.y - A.y);
D.y = B.y;

下の画像に示すように:

ここに画像の説明を入力してください

4

3 に答える 3

7

補間が必要なのはx座標です。BDy座標は、ダイアグラム上で等しくなります。

D.x = A.x + (B.y - A.y) * (C.x - A.x) / (C.y - A.y);
D.y = B.y;

また、Dx が Ax と Cx の間の任意の場所である Cy == Ay の場合に備える必要があります。これを行う 1 つの方法は、三角形を描画しないことです。三角形abs(C.y - A.y) < deltadelta1 ピクセル程度の大きさです。

于 2012-01-16T23:49:13.233 に答える
2
D.y = B.y

delta_x = C.x - A.x 
delta_y = C.y - A.y 

dist_y = B.y - A.y

percent = dist_y / delta_y

D.x = A.x + percent * delta_x
于 2012-01-16T23:54:58.483 に答える
1

ライン AC の関数は ですy = mx + b

m = (Ay - Cy)/(Ax - Cx)

次に、A を次のように置き換えることができます。A.y = A.x * m + b

b = Ay - Ax *m

y から x を計算する必要があるため、関数を入れ替えます。

mx = y -b

x = (y -b)/m

これらは、三角形のその辺に沿って y から x を見つけるための 3 つのステップです。Dy を見つけるために補間を行う必要がないことに注意してください。簡単に言えば、Dy = By

私が今書いたものをより小さな一連のステップに最適化できることに注意してください。でも、読みやすいコードを書いたほうがいいと思います。

于 2012-01-16T23:50:17.680 に答える