2

v1 と v2、ベクトル v3 と角度aの 2 つのベクトルで形成された 1 つの線分があります。線分 v1-v2 と v3-v4 が角度aになるように、Javaでメソッドを作成するにはどうすればよいですか(私はベクトルを表すために Apache Commons Math も使用しています) 無限の v4 要素があります。線分 v3-v4 がそのサイズになるように、そのメソッドにサイズを指定できればさらに良いでしょう。(すべて 2 次元空間で、角度はラジアンでも度でもかまいません)

編集:約束どおり、解決しようとしている問題の画像を含めました。2 つのベクトル (線は少し長いですが、それは問題ではありません)、角度、および 3 番目の点で定義された線分があります。角度aで最初の線と交差する 2 番目の線を描画する必要があります。Javafx (ここで使用) のすべての線は 2 つの点を定義することによって描画されるため、赤い点 (または考えられる点) を見つける必要がありました。 問題の視覚的表現

編集:アリの答えを使用して、必要なことを行う次の方法を取得しました:

public Pair<Vector2D, Vector2D> calculateFourthPoint(Vector2D v1, Vector2D v2, Vector2D v3, double angleInDegrees) {
    Vector2D r = v1.subtract(v2);
    double rx = r.getX();
    double ry = r.getY();
    double angle = toRadians(angleInDegrees);

    double a = pow(rx, 2) + pow(ry, 2);
    double b = 2 * sqrt(pow(rx, 2) + pow(ry, 2)) * cos(angle) * rx;
    double c = pow(rx, 2) * pow(cos(angle), 2) + pow(ry, 2) * pow(cos(angle), 2) - pow(ry, 2);
    double discriminant = sqrt(pow(b, 2) - (4 * a * c));

    double sx1 = (-b + discriminant) / (2 * a);
    double sx2 = (-b - discriminant) / (2 * a);

    double sy1 = sqrt(1 - pow(sx1, 2));
    double sy2 = sqrt(1 - pow(sx2, 2));

    Vector2D s1 = new Vector2D(sx1, sy1);
    Vector2D s2 = new Vector2D(sx2, sy2);

    Vector2D v4_1 = v3.subtract(s1);
    Vector2D v4_2 = v3.subtract(s2);

    return new Pair<Vector2D, Vector2D>(v4_1, v4_2);
}
4

2 に答える 2

2

残念ながら、ここでLaTeXスタイルの方程式を実行することはできません(または、実行できますか?わからない、ここで実行したことはありません...)が、ここでは次のようになります。

v1-v2 · v3-v4 = |v1-v2| * |v3-v4| * cos(a)   (by definition)

|v3-v4|単位ベクトルとして定義し、次のようにします。

v1-v2 · v3-v4 = |v1-v2|*1*cos(a) = |v1-v2|*cos(a)

左側を外側に向けて作業すると、

v1·v4 + v2·v4 = |v1-v2|*cos(a) - v1·v3 + v2·v3

また

(v1+v2)·v4 = |v1-v2|*cos(a) - (v1-v2)·v3 

その間

|v3-v4| = (v3-v4)·(v3-v4) = 1    

したがって、2つの未知数に2つの方程式があります。さて、簡潔にするために、

aa  = (v1+v2|x
bb  = (v1+v2|y
x1 = v4|x
x2 = v4|y
A  = |v1-v2|*cos(a) - (v1-v2)·v3 

ここで、は-componentなど|xを意味します。これにより、簡単な置換により、x

( (A-aa*x1)/bb )^2 + (aa*x1)^2 = 1     (-> 2 solutions)
( (A-bb*x2)/aa )^2 + (bb*x2)^2 = 1     (-> another 2 solutions) 

解は少し面倒でここに書き留めることはできませんが、簡単に解ける単純な2次方程式です。

次に、周りの単位円上にある4つの一意のベクトルv3があります(図を参照)。これらの4つのベクトルは、2つの異なる線のみになりますが、4つのベクトルすべてを見つけることをお勧めします(セルフチェックとして、および堅牢性を向上させるために、ベクトルの1つが何かのようなものである場合があります。壊滅的なキャンセルが発生するように)。

もちろん、どのラインがあなたに最も適しているかは、ユースケースによって異なります。

選択するソリューションが何であれ、もちろん常に次のことを確認する必要があります。

arccos(((v1-v2)·(v3-v4))/|v1-v2|) = a

あるべき姿。

状況スケッチ

于 2012-08-10T09:39:11.847 に答える
2

私は Apache Commons Math を知らないので、疑似コードで書いています。ベクトルの成分vxおよびをそれぞれおよび とします。vyxyv

r=v1-v2してみましょうs=v3-v4。未知数が 2 つ (つまりsxsy; とv4=v3-s) あるため、2 つの方程式が必要です。これらは次のとおりです。

dot_product(r,s)=length(r)*cos a // forces the desired angle

dot_product(s,s)=1 // just sets the length of s to 1

それを詳しく説明すると、上記の方程式は次のようになります。

(1)    rx*sx + ry*sy = sqrt(rx^2+ry^2)*cos a

(2)    sx^2 + sy^2 = 1

最初の方程式は、 と の両方で線形sxですsy。最初の方程式から消去しましょうsy(ゼロではないと仮定しryます)

 sy = (1/ry)*(sqrt(rx^2+ry^2)*cos a - rx*sx)

これsyを2番目の式に代入します。で 2 次方程式が得られsy(複雑なのでここには書きません)、2 つの解があります。sx値を代入することで、対応するsy値を取得します(ゼロではないと仮定しrxます):

 sx = (1/rx)*(sqrt(rx^2+ry^2)*cos a - ry*sy).

最後に、v4=v3-s. 2次方程式の解ごとに 1 つずつ、v4 の 2 つの解が得られます。(null ベクトルであるなどの退化したケースはr、私の回答では無視されます。)

于 2012-08-09T20:19:03.747 に答える