2016-11-06 316 views
2

我想在python中編寫一個函數來計算四個投影點的交叉比例,我想知道是否有一個優雅和簡潔的實現來處理無限個案例。計算交叉比率

甲幼稚實施交比的看起來像這樣:

ratio = lambda a,b,c: (a-c)/(b-c) 
cross_ratio = lambda a,b,c,d: ratio(a,b,c)/ratio(a,b,d) 

但是,當一個輸入是無限這個失敗。這不應該發生,而是我們希望無限的「互相抵消」,並給我們一個簡單的比例。

例如,Infinity, 0, 1, -1的交叉比應該是-1

另外,我想處理以兩個數字的比例表示的積分。因此(1 1)將是數1,而(1,0)將代表Infinity

我總是可以的情況下回落到一個定義,並用它做什麼,但我覺得這可能是學習好的設計的好機會。

我正在使用Python 2.7和Sagemath模塊。有關如何實現這一點的任何建議?

回答

1

我想試試這個:

def det2(a, b): return a[0]*b[1] - a[1]*b[0] 
def cr2(a, b, c, d): return vector([det2(a,c)*det2(b,d), det2(a,d)*det2(b,c)]) 

這將輸入使用齊次座標,所以你INOUT兩個元素的矢量。它也將返回齊次座標的結果,作爲一個兩元素向量,所以您可以獲得無限交叉比的乾淨描述。如果您需要的結果是一些領域的一個元素,而不是,只是使用的替代載體構造師:

def cr2(a, b, c, d): return (det2(a,c)*det2(b,d))/(det2(a,d)*det2(b,c)) 

我加了後綴2我的公式,因爲我個人經常需要四個共線點的交比飛機。在這種情況下,我會使用

def det3(a, b, c): 
    return matrix([a,b,c]).det() # Or spell this out, if you prefer 
def cr3(a, b, c, d, x): 
    return vector([det3(a,c,x)*det3(b,d,x), det3(a,d,x)* det3(b,c,x)]) 

現在讓x是任何點共線a,b,c,d,你會得到這四點的交比。或者更一般地說,如果a,b,c,d不是共線的,則可以將連接它們的四條線的交叉比率設置爲x,這對於許多場景很有用,其中很多場景涉及錐形。

1

最好的是與投影線一起工作。

這裏的文檔包含有用的提示: http://doc.sagemath.org/html/en/reference/schemes/sage/schemes/projective/projective_space.html

這裏是交比的一種實現中,與實施例。

sage: P = ProjectiveSpace(1, QQ) 
sage: oo, zero, one = P(1, 0), P(0, 1), P(1, 1) 
sage: tm = P.point_transformation_matrix 
sage: def cross_ratio(a, b, c, d): 
....:  a, b, c, d = P(a), P(b), P(c), P(d) 
....:  m = tm([a, b, c], [oo, zero, one]) 
....:  return P(list(m*vector(list(d)))) 
....: 
sage: cross_ratio(oo, zero, one, 1/2) 
(1/2 : 1) 
sage: cross_ratio(1, 2, 3, 4) 
(4/3 : 1)