3

Ok、

次のように位置が定義されている発射体があります。

a.x = initialX + initialDX * time;

a.y = initialY + initialDY * time + 0.5 * gravtiy * time^2;

この発射体が環境内のどの障害物と衝突するかを予測できるようにしたいと思います。曲線上の最も近い点Aから点Pまでの距離を確認する予定です。

Aで、曲線の接線はベクトルAPに垂直になり、 Aでの曲線の接線は、単にその点での発射物の速度Vになると思います。

APドットV =0

ap.x = initialX + initialDX * time - p.x;

ap.y = initialY + initialDY * time + gravity * time^2 - p.y;

v.x = initialDX;

v.y = initialDY + gravity * time;

=>

APドットV =

( 0.5 * gravity^2 ) * t^3 +

( 1.5 * gravity * initialDY  ) * t^2 +

( initialDX^2 + initialDY^2 + gravity * ( initialY - p.y ) ) * t +

( initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y ) )

ここから、これが3次関数であることがわかります。私はオンラインで調査することに時間を費やしましたが、根を見つけるための特定の値に対して機能すると思われる一般的な方程式があることがわかりました。

これは私が実装しようとしたプロセスです。 http://www.sosmath.com/algebra/factor/fac11/fac11.html

a = 0.5 * gravity^2;

b = 1.5 * gravity * initialDY;

c = initialDX^2 + initialDY^2 + gravity * ( initialY - p.y );

d = initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y );

A = ( c - ( b * b ) / ( 3 * a ) ) / a;

B = -( d + ( 2 * b * b * b ) / ( 27 * a * a ) - ( b * c ) / ( 3 * a ) ) / a;

workingC = -Math.pow( A, 3 ) / 27;

u = ( -B + Math.sqrt( B * B - 4 * workingC ) ) / 2; // Quadratic formula

s = Math.pow( u + B, 1 / 3 );

t = Math.pow( u, 1 / 3 );

y = s - t;

x = y - b / ( 3 * a );

xを時間として曲線の元の方程式に戻すと、Aが得られるはずです。これは特定の値に対してはうまく機能するようですが、pyが特定の値を超える場合、2次方程式の平方根を取るための正の値がありません。

なぜこれが起こっているのか、または問題を解決するために何ができるのかを理解するのに十分な数学の理解がありません。

これに関する助けをいただければ幸いです。

アップデート:

複雑な根を処理するようにアルゴリズムを調整しましたが、まだ問題があります。これは、判別式が負の場合に私が今行うことです。

a = 0.5 * gravity^2;

b = 1.5 * gravity * initialDY;

c = initialDX^2 + initialDY^2 + gravity * ( initialY - p.y );

d = initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y );

A = ( c - ( b * b ) / ( 3 * a ) ) / a;

B = -( d + ( 2 * b * b * b ) / ( 27 * a * a ) - ( b * c ) / ( 3 * a ) ) / a;

workingC = -Math.pow( A, 3 ) / 27;

discriminant = B * B - 4 * workingC;

then if discriminant < 0;

uc = new ComplexNumber( -B / 2, Math.sqrt( -discriminant ) / 2 ); 

tc = uc.cubeRoot( ); 

uc.a += B;

sc = uc.cubeRoot( ); 

yc = sc - tc; 

yc.a -= b / ( 3 * a ); 

x = -d / ( yc.a * yc.a + yc.b * yc.b ); 

どういうわけか、これはまだ私が期待する結果を与えていません。ここで間違っていると目立つものはありますか?

4

1 に答える 1

4

実数多項式は複素数の根を持つことができ、根が実数でない場合、それらは共役ペアで発生します。

これは、3次方程式が常に少なくとも1つの実根を持つことを意味します。

これで、メソッドを使用して複素数の根を取得する場合は、共役を取得し、3次の定数を多重に除算し、逆数を使用して実数の根を取得することができます。

したがって、-ve数の平方根を取る必要がある場合は、その係数の平方根に虚数'i'を掛けることと同じです。

したがって、ルートを(m、n)として表すと、複素数m +inを表します。次に、もう一方のルートはm --i n =(m、-n)であり、mとnは実数です。

この場合、3次はP(x)=(x ^ 2-2m +(m ^ 2 + n ^ 2))(xr)と書くことができます。

したがって、P(x)= x ^ 3-a_1 * x ^ 2 + a_2 * x --a_3の場合、r = a_3 /(m ^ 2 + n ^ 2)(a_3は根の積であり、はr(m ^ 2 + n ^ 2))

rを取得する簡単な方法は、式r = a_1-2mを使用することです(a_1は根の合計であり、r + 2mです)。

チェックアウト: http: //en.wikipedia.org/wiki/Complex_number

于 2010-07-13T22:56:33.633 に答える