1

3 つの共平面 (2D) 点 (X1、Y1)、(X2、Y2)、および (X3、Y3) が与えられ、(それぞれ ...) 「1 = 私がいた場所、2 = 私がいる場所、および3=どこへ行くのかを教えてくれる単純なアルゴリズムが必要です。

  • 右に曲がります
  • 少し左折します
  • 左に曲がります

言い換えれば、(a) は左または右へのターンです。(b) ターンの鋭さ (これについては恣意的にさせてください)。

最初の部分については、パスが左に曲がるか右に曲がるかに基づいて、外積を使用する方法 (ウィキペディア: Graham Scan と質問 #26315401 を参照) を既に学習しました。反時計回り。

そして、ATAN2() がターンの鋭さを決定する中核になると確信しています。

しかし、私は..まったく..すべての向きで機能する適切な数学に頭を悩ませることはできません。(特に、角度がゼロラインを横切る場合。(350 度から 10 度の方位は 20 度のギャップであり、340などではありません。)

さて、私は疲れています。[...今朝、頭を壁にぶつけた。] さて、質問する時が来ました... :-)

4

3 に答える 3

0

編集済み - 以下は間違っています。 私の元の応答は次のとおりでした...

あなたの回答を使用しようとすると、期待される回答が得られません。

ポイントが (1,1)、(3,2)、および (6,3) であるとします。緩やかな右折。

スプレッドシートを使用すると、X12=2、X23=3、Y12=1、Y23=3 となり、ATAN2 の結果 (度) は 101.3 です。90度以上の急カーブ。行 2 のスプレッドシートの式 (X1、Y1、X2、Y2、X3、Y3、X12、X23、Y12、Y23 および回答をリスト) は次のとおりです。

=DEGREES(ATAN2(G2*J2-H2*I2; G2*I2+H2*J2))

(スプレッドシート、OpenOffice には、ATAN2 の最初のパラメーターとして「X」がリストされています。)

タイプミスは私の側にあると確信していますか?

そして、実際のところ(いわば)、「はい、そうでした!」

(へー、私は実際にそれを自分で言った. 当たり前のように、すでにそれらを交換することは私には起こらなかった. )

私のスプレッドシートのバージョンの ATAN2 関数は、最初にXパラメータを指定します。ほとんどのプログラミング言語(Delphi、Perl、PHP ...)は最初にYを指定し、それが (正しい!) 答えが与えられた方法です。

数式を編集し、スプレッドシートの定義に合わせてパラメーターを逆にすると、問題はなくなり、(編集された)返信から値を再現することができました。パラメータを逆にした、修正された式を次に示します。

=DEGREES(ATAN2(G2*I2+H2*J2; G2*J2-H2*I2))
               ^^== X ==^^  ^^== Y ==^^

繰り返しになりますが、このスプレッドシートのATAN2 の実装は、ほとんどのプログラミング言語の実装とは逆になっているため、この式の変更が必要でした。Y を最初にリストした最初の回答は、ほとんどのプログラミング言語で正しいものです。

于 2015-04-21T18:26:43.863 に答える
0

うーん、まだ少し問題がありそうです。. .

ポイントがほぼ直線で互いに非常に離れている場合、「大きな角度」を考え出しています。例:

P1: (0.60644,0.30087) .. P2: (0.46093,0.30378) .. P3: (0.19335,0.30087)

X 座標は増加しますが、Y 座標はほぼ同じままです。

x12=-0.145507 .. y12=-0.00290698

x23=-0.267578125 .. y23=0.002906976

(座標が象限 IV にあり、Y が下向きに増加するため、Y の差を逆にしました。)

x=-0.000354855 ..y=-0.00120083

ans= -106.462 (度)

ポイントはほぼ同一線上にあるため、答えは非常に小さいと予想しました。ご覧のとおり、106 度を超えています。

于 2015-04-28T19:41:11.333 に答える