设计并实现一个名为Circle2D的类,其中包含:
两个名为x和y的数据字段,用于指定圆的中心。
具有get / set方法的数据字段半径。方法getRadius()返回 setRadius()设置半径的新值时半径的值。
构造函数(即 init 方法),用于创建具有指定x,y和radius的圆。对所有参数使用默认值0。
str 方法,返回“具有中心(x,y)和半径半径的圆”形式的字符串表示形式,其中x,y和radius将被圆的实际值替换中心和半径。例如,在中心位于(2,3)和半径10的圆形对象上,此方法将返回字符串“Circle with center(2,3)and radius 10”。
getX()和getY()方法..
返回圆圈区域的方法getArea()。
返回圆周长的方法getPerimeter()。
方法containsPoint(x,y),如果指定的点(x,y)为,则返回True 在这个圈子里面。
方法包含(circle2D),如果指定的圆圈在此圆圈内,则返回True。
方法重叠(circle2D),如果指定的圆与此圆重叠,则返回True。
实现_ 包含 _(self,anotherCircle)方法,如果此圈中包含anotherCircle,则返回True。 _ 包含 _(self,item)特殊方法用于实现成员资格测试运算符。如果item在self中,则返回true,否则返回false。
实施_ lt _,_ le _,_ gt _,_ ge _,_ eq _和_ ne _方法,根据半径比较两个圆圈。
到目前为止我的代码:
import math
class Circle2D(object):
def __init__(self, x = 0, y = 0, r = 0):
"""Creates a circle with specified x, y, and radius."""
self._x = x
self._y = y
self._r = r
def __str__(self):
"""Returns the string representation."""
return ("Circle with center" + "(" + "%0.0f" % (self._x) + ", "
+ "%0.0f" % (self._y) + ")" + "and radius " + "%0.0f" % (self._r))
def getX(self):
"""Returns the X value."""
return self._x
def getY(self):
"""Returns the Y value."""
return self._y
def getRadius(self):
"""Returns the value of the radius"""
return self._r
def setRadius(self):
"""Sets a new value for the radius."""
pass
def getArea(self):
"""Returns the area of the circle."""
return math.pi * self._r * self._r
def getPerimeter(self):
"""Returns the perimeter of the circle."""
return 2 * math.pi * self._r
def containsPoint(x,y):
"""Returns True if the specified point (x, y) is inside this circle."""
if (self._x)^2 + (self._y)^2 <= (self._r)^2:
return True
else:
return False
def contains(circle2D):
pass
def overlaps(circle2D):
pass
def main():
x = float(input("Enter x coordinate for the center of circle 1: "))
y = float(input("Enter y coordinate for the center of circle 1: "))
r = float(input("Enter the radius of circle 1: "))
c1 = Circle2D(x, y, r)
print(c1)
x = float(input("\nEnter x coordinate for the center of circle 2: "))
y = float(input("Enter y coordinate for the center of circle 2: "))
r = float(input("Enter the radius of circle 2: "))
c2 = Circle2D(x, y, r)
print(c2)
#Test the getArea() and getPerimeter() methods
print("\nArea of a %s is %0.2f" % (c1, c1.getArea()))
print("Perimeter of a %s is %0.2f" % (c1, c1.getPerimeter()))
print("\nArea of a %s is %0.2f" % (c2, c2.getArea()))
print("Perimeter of a %s is %0.2f" % (c2, c2.getPerimeter()))
#-------------------
#Test containsPoint() method
print("\nResult of c1.containsPoint(c2.getX( ), c2.getY( )) is",
c1.containsPoint(c2.getX( ), c2.getY( )))
#Test contains() method
if c1.contains(c2):
print("\n%s contains %s" % (c1, c2))
else:
print("\n%s does not contain %s" % (c1, c2))
print("\nResult of c2.contains(c1) is",
c2.contains(c1))
#----------------
#Test overlap() method
if c1.overlaps(c2):
print("\n%s overlaps with %s" % (c1,c2))
else:
print("\n%s does not overlap with %s" % (c1,c2))
#--------------
#Test overloaded in operator
print("\nResult of c2 in c1 is", c2 in c1)
#Testing overloaded comparison and equality operators
#Something similar to this
print("\nTesting overloaded comparison operators...")
print("c1 == c2?", c1 == c2)
print("c1 != c2?", c1 != c2)
print("c1 < c2?", c1 < c2)
print("c1 <= c2?", c1 <= c2)
print("c1 > c2?", c1 > c2)
print("c1 >= c2?", c1 >= c2)
print('c1 == "Hello"?', c1 == "Hello")
print('c1 != "Hello"?', c1 != "Hello")
main()
现在,我专注于containsPoint,contains和重叠方法。我尝试了containsPoint,但是我收到一个错误,指出:“containsPoint()需要2个位置参数但是3个被赋予”
任何帮助都将不胜感激。
-Thanks
答案 0 :(得分:3)
containsPoint
是一种方法,因此需要self
作为其第一个参数:
def containsPoint(self, x, y):
你显然知道,如果你需要知道圆点和圆心之间的距离,你需要使用毕达哥拉斯定理。在这种情况下,边将是点和圆的中心坐标(即x和y轴上的距离)的差异,以及你想要的斜边的距离:
dist^2 = (x - self._x)^2 + (y - self._y)^2 # Note: not valid Python code
请注意,由于减法结果是平方的,因此您无需关心顺序(减法结果可能为负数,但仍会产生正确的结果)。
如果此距离小于或等于半径,则该点位于圆圈内:
(x - self._x)^2 + (y - self._y)^2 <= self._r^2
要计算圆是否重叠或包含在其他圆中,您将使用与该点相同的计算来计算两个圆的中心之间的距离,然后将其与半径进行比较。