2012-04-17 12 views
1

私は3つのユーザーが選択した点から円の中心を決定するために、この式を実装しようとしています: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

+0

あなたは、紙で最初にすべてをチェックしたはずだと言うのは間違いありません。それが起こったとき、関数は期待どおりに機能しましたが、少なくともチェックの後、問題がfindCircle関数にないと確信することができました。これにより解決策が見つけられました(下記参照) – Alex

答えて

2

あなたの部門のオペランドが両方とも整数なので、結果は(floored)整数になります。 Pythonでは2/3 == 0です。これは、適切に四捨五入されないので、あなたの計算を少し捨ててしまいます。ちょうどdではなくfloat(d)で除算してみてください。

+1

Python 2.2またはこの問題は、 'from __future__ import division'を使ってデフォルトで浮動小数点除算を使用することでコードを将来的に証明することもできます(int除算は'/'演算子として利用可能です)。 – Darthfett

+0

私はfloatを使った数学演算は、常にPythonで浮動小数点数を返します。もちろん許しているバージョン。 – Paystey

+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

0

ウォンキー(数学的観点からは、コンピュータグラフィックスの視点ではない)座標系がこれを動作させないかどうかは、私の質問に対する答えはNOです。

単にイベントがクリックであって、単にマウスの動きではないことを確認するためにマウスコールバック関数にチェックを追加するのを忘れてしまった。私のポイントは私がクリックしたものではなかった!

おかげでこれを探して、多分これはあなたが知っているいくつかの数字をテストすることができます

関連する問題