def test_FitSmallestCircleCustomImpl(self): generator = Random2DPointsSetGenerator(nPointsMin=25, nPointsMax=60, xmin=-15, xmax=15, ymin=-15, ymax=15, stub=False) for testIter in range(MaxTestIter): randomPoints = generator.Generate() radius, center = FitCircleTo2DPoints(randomPoints, useExternalImpl=False) circle = Circle(radius, center) radiusExt, centerExt = FitCircleTo2DPoints(randomPoints, useExternalImpl=True) #all random points must be inside the circle or on its perimeter for point in randomPoints: self.assertTrue(circle.ContainsPoint(point)) #radius from custom impl. is often slightly larger than one from external impl., #but sometimes, they are nearly identical if not radiusExt <= radius: print("\nFor a random set of " + str(len(randomPoints)) + " points :") print("radius, center from external impl. " + str(round(radiusExt, 4)) + ", " + str(centerExt)) print("radius, center from custom impl. " + str(round(radius, 4)) + ", " + str(center)) self.assertTrue(radiusExt < radius + Point2D.COMPARISONTOLERANCE)
def test_FitSmallestCircleExternalImpl(self): generator = Random2DPointsSetGenerator(nPointsMin=25, nPointsMax=60, xmin=-15, xmax=15, ymin=-15, ymax=15, stub=False) euclideanDist = lambda p1, p2: pow( pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2), 0.5) for testIter in range(MaxTestIter): randomPoints = generator.Generate() radius, center = FitCircleTo2DPoints(randomPoints, useExternalImpl=True) circle = Circle(radius, center) nRandomPointsOnPerimeter = 0 #all random points must be inside the circle or on its perimeter for point in randomPoints: self.assertTrue(circle.ContainsPoint(point)) if abs(euclideanDist(point, center) - radius) <= Point2D.COMPARISONTOLERANCE: nRandomPointsOnPerimeter += 1 #at least 2 points must be on the perimeter of the circle self.assertTrue(nRandomPointsOnPerimeter >= 2)
def test_PointInCircleMethod(self): r = 7 c = Point2D(3, 5) circle = Circle(radius=r, center=c) # points inside circle for testIter in range(int(MaxTestIter / 2)): rad = random.uniform(0, r) theta = random.uniform(0, 2 * math.pi) x = c.x + rad * math.cos(theta) y = c.y + rad * math.sin(theta) if not circle.ContainsPoint(Point2D(x, y)): print(Point2D(x, y)) self.assertTrue(circle.ContainsPoint(Point2D(x, y))) # points outside circle for testIter in range(int(MaxTestIter / 2)): rad = r + random.uniform(Point2D.COMPARISONTOLERANCE, 100) theta = random.uniform(0, 2 * math.pi) x = c.x + rad * math.cos(theta) y = c.y + rad * math.sin(theta) self.assertFalse(circle.ContainsPoint(Point2D(x, y)))