[英]How to determine if 3 points are exactly collinear in Z^2
另一個共線點問題。 這個問題是,我正在使用整數算法,正在尋找精確的共線性,而不是基於模糊epsilon的測試。
使用內聯匯編,我可以得到一個確切的答案:x86乘法指令可以訪問乘積的高低部分,這兩者在計算叉積( X - A ) x ( B - A )時都很重要; 我可以簡單地將兩個半部分或在一起並測試零。 但我希望有一種方法可以在C中完成,那就是:
大致按此順序。 同時,做/不做的一種方法是:
double
我不關心X是否超出AB段; 那只是四個無趣的比較。
我的噩夢場景是必須將每個坐標分量分成兩半,並明確地進行長乘法,以便可以跟蹤部分乘積中的所有高半部分。 (然后必須明確地進行“隨身攜帶”。)
經過一些比較和簡單的檢查后,您可以獲得2對正數(x1,y1)
, (x2,y2)
,它們要檢查x1*y2==x2*y1
。
您可以使用歐幾里得算法來找到x1
和y1
的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.