如何检查圆是重叠还是在第二个圆内并且一个点是否在第二个圆内?

时间:2015-02-10 01:46:26

标签: python

设计并实现一个名为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()方法..

返回圆圈区域的方法g​​etArea()。

返回圆周长的方法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

1 个答案:

答案 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

要计算圆是否重叠或包含在其他圆中,您将使用与该点相同的计算来计算两个圆的中心之间的距离,然后将其与半径进行比较。