2012-04-17 19 views
1

我試圖實現此方程以確定從三個用戶選擇的點的圓的中心:http://en.wikipedia.org/wiki/Circumscribed_circle#Cartesian_coordinates是一個左上角的原點座標系什麼阻止了這個方程的工作?

首先,點由這OpenCV的鼠標回調函數的裝置獲取並組裝成一個列表:

def setupPoints(event, x, y, flags, points): 
    #Populates a provided list 'points' with 
    #three coordinates representing the edge of 
    #a circle 
    if points[0] == 0: 
     points[0] = (x,y) 
    elif points[1] == 0: 
     points[1] = (x,y) 
    else: 
     points[2] = (x,y) 

然後我通過點列表這個功能,它做的工作:

def findCircle(p): 
    #Returns the circle centre 
    #from three provided points provided as tuples 
    #in a list 
    #See http://en.wikipedia.org/wiki/Circumscribed_circle#Cartesian_coordinates 
    ax = float(p[0][0]) 
    ay = float(p[0][1]) 
    bx = float(p[1][0]) 
    by = float(p[1][1]) 
    cx = float(p[2][0]) 
    cy = float(p[2][1]) 

    d = 2*(ax*(by-cy)+bx*(cy-ay)+cx*(ay-by)) 
    centrex = ((pow(ax,2)+pow(ay,2))*(by-cy)+(pow(bx,2)+pow(by,2))*(cy-ay)+(pow(cx,2)+pow(cy,2))*(ay-by))/d 
    centrey = ((pow(ax,2)+pow(ay,2))*(cx-bx)+(pow(bx,2)+pow(by,2))*(ax-cx)+(pow(cx,2)+pow(cy,2))*(bx-ax))/d 

    return (int(round(centrex)), int(round(centrey)), int(round(d))) 

但是,它不工作。返回的數字不是大量的,但肯定是不正確的。這可能是因爲OpenCV使用的座標系統的原點位於圖像的左上角(圖像中的點仍然是正數,所以可以說它是「向後」計數,至少垂直)。

或者這是猜錯了?

+0

你可以與一些你知道的數字測試,那麼你就可以在輸入的數字是錯誤的座標系的腳的問題。手動做數學運算,讓你知道答案,輸入數字。在錯誤的座標系中再次輸入數字。 – Paystey 2012-04-17 19:54:14

+0

你說得對,我應該先在紙上檢查一遍。當它發生時,函數按預期工作,但至少在檢查後我可以確信問題不在findCircle函數中 - 這導致我找到解決方案(參見下文) – Alex 2012-04-17 21:30:47

回答

2

更可能是因爲你的部門的操作數都是整數,所以結果是一個(地板)整數。在Python中,2/3 == 0。這會使你的計算稍微鬆散,因爲它們不會被正確舍入。嘗試除以float(d)而不僅僅是d

+1

如果您使用的是Python 2.2或後來,這個問題,你也可以通過使用'from __future__ import division'來默認使用浮點除法(int division依然可以作爲'//'運算符)來驗證你的代碼。 – Darthfett 2012-04-17 19:50:53

+0

我雖然任何與浮動數學運算總是會導致在Python中的浮動。當然版本允許。 – Paystey 2012-04-17 19:52:30

+0

@Paystey如果兩個數字都是整數,它使用整數除法。否則,浮動分割。 [從Python 3.0開始](http://www.python.org/dev/peps/pep-0238/),float division是'/'運算符的默認值,int division是默認值'/'運營商。例如,請參閱[this](http://mail.python.org/pipermail/tutor/2008-March/060886.html)。 – Darthfett 2012-04-17 19:57:12

0

對於我的問題,關於從數學的角度來看,而不是計算機圖形學的觀點來看,座標系是否妨礙了這個工作的答案是NO。

我只是忘了添加一個檢查我的鼠標回調函數,以確保事件是一個點擊,而不是簡單的鼠標移動;我的觀點不是我點擊的!

感謝您看這個,也許這將幫助別人的未來...

相關問題