Python 左上角的原点坐标系是什么';是什么阻止了这个方程式的运行?

Python 左上角的原点坐标系是什么';是什么阻止了这个方程式的运行?,python,math,opencv,Python,Math,Opencv,我试图实现这个等式,从三个用户选择的点确定圆心: 首先,通过此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)

我试图实现这个等式,从三个用户选择的点确定圆心:

首先,通过此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使用的坐标系的原点位于图像的左上角(图像中的点仍然为正,因此可以说是“向后”,至少是垂直计数)


或者这个猜测是错误的?

很可能是因为除法的操作数都是整数,所以结果是一个(落地的)整数。在Python中,
2/3==0
。这会使你的计算稍微偏离一点,因为它们不会正确地四舍五入。试着用
float(d)
除法,而不仅仅是
d

我的问题的答案是:不可靠的(从数学的角度,而不是计算机图形学的角度)坐标系是否阻止了这一点

我只是忘了在我的鼠标回调函数中添加一个检查,以确保事件是一次点击,而不仅仅是鼠标移动;我的分数不是我点击的


感谢您关注这一点,也许这会对将来的人有所帮助…

如果您使用的是Python 2.2或更高版本,那么这就是问题所在,您还可以通过使用
from\uuuuuu future\uuuuuu import division
默认情况下使用float division(int division仍然可用作
/
操作符)来验证代码的未来性.我认为在python中,任何带有浮点的数学运算都会导致浮点。当然,版本允许。@Paystey如果两个数字都是整数,则使用整数除法。否则,浮动除法,浮点除法是
/
运算符的默认值,int除法是
/
运算符的默认值。请参阅示例。谢谢,但d已经是一个浮点,因为它是在独占浮点上操作的结果而创建的。我刚刚添加了一个检查来验证这一点。你可以用一些你知道的数字进行测试,然后你可以把问题定位在输入的数字的坐标系错误上。手工做数学题,这样你就能知道答案,输入数字。在错误的坐标系中再次输入数字。你说得对,我应该先在纸上检查一下。正如所发生的那样,函数按预期工作,但至少在检查之后,我可以确信问题不在findCircle函数中-这让我找到了解决方案(见下文)