def __init__(self, polygon: geometry_utils.Polygon, target_size: typing.Optional[float] = None): """Create a new Square. If the points don't form a valid square, raises a WrongShapeError. Args: polygon: The polygon to check. Points will be stored such that the first point stored is the first point in this polygon, but the rest of the polygon may be reversed to clockwise. target_size: If provided, will check against this size when checking side lengths. Otherwise, it will just make sure they are equal. """ if len(polygon) != 4: raise WrongShapeError("Incorrect number of points.") if not geometry_utils.all_approx_square(polygon): raise WrongShapeError("Corners are not square.") side_lengths = geometry_utils.calc_side_lengths(polygon) if not math_utils.all_approx_equal(side_lengths, target_size): raise WrongShapeError( "Side lengths are not equal or too far from target_size.") clockwise = geometry_utils.polygon_to_clockwise(polygon) if clockwise[0] is polygon[0]: self.polygon = clockwise else: self.polygon = list_utils.arrange_index_to_first( clockwise, len(clockwise) - 1) self.unit_length = math_utils.mean(side_lengths)
def __init__(self, polygon: geometry_utils.Polygon): """Create a new LMark. If the points don't form a valid LMark, raises a WrongShapeError.""" if len(polygon) != 6: raise WrongShapeError("Incorrect number of points.") if not geometry_utils.all_approx_square(polygon): raise WrongShapeError("Corners are not square.") clockwise_polygon = geometry_utils.polygon_to_clockwise(polygon) side_lengths = geometry_utils.calc_side_lengths(clockwise_polygon) longest_sides_indexes = list_utils.find_greatest_value_indexes( side_lengths, n=2) if not list_utils.is_adjacent_indexes(side_lengths, *longest_sides_indexes): raise WrongShapeError("Longest sides are not adjacent.") # The longest sides should be about twice the length of the other sides unit_lengths = math_utils.divide_some(side_lengths, longest_sides_indexes, 2) if not math_utils.all_approx_equal(unit_lengths): raise WrongShapeError( "Longest sides are not twice the length of the other sides.") self.polygon = list_utils.arrange_index_to_first( clockwise_polygon, list_utils.determine_which_is_next(polygon, *longest_sides_indexes)) self.unit_length = math_utils.mean(unit_lengths)