簡體   English   中英

如何確定3個點在Z ^ 2中是否完全共線

[英]How to determine if 3 points are exactly collinear in Z^2

另一個共線點問題。 這個問題是,我正在使用整數算法,正在尋找精確的共線性,而不是基於模糊epsilon的測試。

使用內聯匯編,我可以得到一個確切的答案:x86乘法指令可以訪問乘積的高低部分,這兩者在計算叉積( X - AxB - A )時都很重要; 我可以簡單地將兩個半部分或在一起並測試零。 但我希望有一種方法可以在C中完成,那就是:

  1. 防溢出
  2. 隨身攜帶
  3. 優雅

大致按此順序。 同時,做/不做的一種方法是:

  1. 涉及到double
  2. 涉及使用更大的整數類型-假設我已經在使用我的坐標組件類型可用的最大整數類型
  3. 產生假陽性或假陰性。

我不關心X是否超出AB段; 那只是四個無趣的比較。

我的噩夢場景是必須將每個坐標分量分成兩半,並明確地進行長乘法,以便可以跟蹤部分乘積中的所有高半部分。 (然后必須明確地進行“隨身攜帶”。)

經過一些比較和簡單的檢查后,您可以獲得2對正數(x1,y1)(x2,y2) ,它們要檢查x1*y2==x2*y1

您可以使用歐幾里得算法來找到x1y1的GCD,然后將它們都除以GCM。 (x2,y2)做同樣的事情。 如果在兩種情況下您使用相同的對,則兩個向量的方向相同。

如果三個點(a,b,c)完全共線,則以下恆等式成立:

c = a + (a - b) * scalar

即:

c - a = scalar * (a - b)

因此,取(ca)的第一部分,除以(ab)的第一部分,保存該值。 然后對每個后續組件重復,如果它們中的任何一個不同,則這些點不是共線的。

如果要避免完全使用浮點除法(這是最簡單的方法),則必須存儲比率,然后進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM