我试图在我的Class Circle中构建一个函数绘制,它获得一个由列表列表表示的矩阵,它有m行和n列,并且在每个单元格中都有0,(i, j)单元格表示(i,j)点,该函数应将给定圆中包含的每个(i,j)单元格更改为一个。
示例:
>>> mat =[[0 for j in range(5)] for i in range(7)]
>>> mat
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0,
0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> Circle(40,10,1).draw(mat)
>>> mat
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 1, 1,
0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
这是我写的代码:
import math
class Point():
""" Holds data on a point (x,y) in the plane """
def __init__(self, x=0, y=0):
assert isinstance(x,(int, float)) and isinstance(y,(int, float))
self.x = x
self.y = y
class Circle():
""" Holds data on a circle in the plane """
def __init__(self,*args):
if len(args)==2:
if isinstance(args[0],Point) and isinstance(args[1],(float,int)):
assert args[1]>0
self.center= args[0]
self.radius= args[1]
if len(args)==3:
assert args[2]>0
self.a=args[0]
self.b=args[1]
self.center= Point(self.a,self.b)
self.radius= args[2]
def contains(self,check):
if isinstance(check,(Point)):
if math.sqrt((self.center.x-check.x)**2 + (self.center.y-check.y)**2) <= self.radius:
return True
if isinstance(check,Circle):
test= math.sqrt((self.center.x-check.center.x)**2 + (self.center.x-check.center.x)**2)
if test < (abs((self.radius)-(check.radius))):
return True
else:
return False
def intersect(self,other):
check= math.sqrt((self.center.x-other.center.x)**2 + (self.center.y-other.center.y)**2)
if check >(self.radius+other.radius):
return False
if check < (self.radius+other.radius):
return True
def draw(self,mat):
for lst in mat:
for j in lst:
if Circle.contains(self,(lst,j)):
mat[lst[j]]=1
答案 0 :(得分:0)
我找到了你的错误!首先我在你的代码中添加一个打印,如下所示:
def draw(self,mat):
for lst in mat:
for j in lst:
if Circle.contains(self,(lst,j)):
print 'it is ok'
mat[lst[j]]=1
运行它,你会发现代码print 'it is ok'
永远不会运行。它告诉我们你的判决总是错误的。
我检查了你的Circle.contains(self,(lst,j))
函数,你的参数就像([0,0,...],j),而你的函数想要的只是一个Point或Circle,所以它永远不会返回True。
我想修复你的代码,但我认为你的垫子有问题,所以这只是一些建议。你还需要两次考虑你的目的!