2012-02-28 7 views
8

もう一つの共線点問題。これは私が整数演算を使用していて、正確にの共線性を探していて、曖昧なイプシロンベースのテストではありません。Z^2で3点が正確に同一線上にあるかどうかを調べる方法

インラインアセンブリでは、私は正確な答えを得ることができます:x86の乗算命令をクロス積を計算する際に重要で、どちらも製品のハイとローの部分、両方へのアクセスを提供します(X - xb-);私は単純に2つの半分を一緒にORしてゼロをテストすることができます。しかし、私はそれはだ、Cでそれを行う方法があります願っています:

  • エレガント
  • ポータブル

    1. オーバーフロー防止大体そのためです。そして、あると同時に、それを行うための方法で/しない:

      1. は大きな整数型を使用することを含む
      2. doubleにキャスト関与 - 私はすでにのために利用できる最大の整数型を使用していることを前提としてい私の座標成分タイプ
      3. は、偽陽性または偽陰性のいずれかを生じます。

      私はXは、セグメントABを超えているかどうかについては、この問題の心配はありませんよ。それはちょうど4つの無益な比較です。

      私の悪夢のシナリオは、各座標コンポーネントを2つの半分に分割し、明示的に長時間の乗算をしなければならないということです。部分積の上位半分をすべて追跡できるようにします。 (。そしてアドオンで持ち運び明示的に行うために持つ)

  • +0

    クロス積はn次元に一般化されますか? –

    +0

    あなたのタイトルにはZ^nが書かれていますが、あなたの質問のテキストには、n = 3(またはn = 2、n = 3、z = 0として扱う)一般的な解決策を探しているのか、n = 3の解決策だけを探しているのかを明確にすることはできますか?なぜなら、n = 2またはn = 3のアプローチは(2つまたは3つの要素の重なり部分の重なりに沿った共線性を調べることによって)任意の次元に容易に一般化できるからである。 – ruakh

    +0

    @OliCharlesworth - [はい、でも( 'n-1')の通常の操作です](http://en.wikipedia.org/wiki/Cross_product#Multilinear_algebra)。 –

    答えて

    2

    いくつかの比較と簡単なチェックの後に、、(x2,y2)の正の数の2つのカップルを得ることができます。x1*y2==x2*y1の場合はチェックしてください。

    ユークリッドアルゴリズムを使用して、x1y1のGCDを検索し、両方をGCMで除算することができます。 (x2,y2)についても同じことをしてください。両方のケースで同じカップルを得た場合、両方のベクトルは同じ方向になります。

    +1

    しかし、すべての数値が共に素数で大きい場合はどうなりますか? –

    +1

    @OliCharlesworth次に、GCDは1で、 'x1 * y2 == x2 * y1'なら' x1 == x2 && y1 == y2' – asaelr

    +0

    あなたは何を得ているのか分かります。 –

    0

    三点(a、b、c)を正確に同一直線上にある場合、以下のアイデンティティが成り立つ:

    c = a + (a - b) * scalar 
    

    すなわち:

    c - a = scalar * (a - b) 
    

    (c-a)の最初のコンポーネントをとり、最初のコンポーネントを(a-b)で割り、その値を保存します。その後、後続のコンポーネントごとに繰り返します。いずれかが異なる場合は、点は同一線上にありません。

    浮動小数点除算(これを実行する最も簡単な方法です)を完全に使用しないようにしたい場合は、比率を格納し、代わりにそれを比較する必要があります。

    +0

    これは、「二重にキャストしないようにする」要件に失敗します。倍精度の代わりに倍音を使用すると、オーバーフローの問題が発生する可能性があります。 –

    +0

    これは論理的に私が答えようとしていたものと等価ですが、問題は、あるコンポーネントを別のコンポーネントで分けるときに浮動小数点で簡単に終わる可能性があり、OPが浮動小数点演算を避けたいと思うように聞こえるということです。 @Osi、Jack; –

    +0

    ;編集を参照してください。また、最も基本的な形式に減らさずにチェック比は同じですが、整数除算ではかなり簡単かもしれません。 – James

    関連する問題