def _get_line_graph(core_parse): """ line graph is a non-directional graph. Nodes are indexed by intersection points. Note that angles, triangles, and quadrilaterals can be parsed from this graph. :param core_parse: :param eps: :return: """ eps = LINE_EPS line_graph = nx.Graph() for key0, key1 in itertools.combinations(core_parse.intersection_points, 2): p0, p1 = core_parse.intersection_points[key0], core_parse.intersection_points[key1] line = instantiators['line'](p0, p1) v0, v1 = core_parse.point_variables[key0], core_parse.point_variables[key1] var = FormulaNode(signatures['Line'], [v0, v1]) if instance_exists(core_parse, line): points = {} for key in set(core_parse.intersection_points).difference({key0, key1}): point = core_parse.intersection_points[key] if distance_between_line_and_point(line, point) <= eps: points[key] = point line_graph.add_edge(key0, key1, instance=line, points=points, variable=var) return line_graph
def _get_line_graph(core_parse): """ line graph is a non-directional graph. Nodes are indexed by intersection points. Note that angles, triangles, and quadrilaterals can be parsed from this graph. :param core_parse: :param eps: :return: """ eps = LINE_EPS line_graph = nx.Graph() for key0, key1 in itertools.combinations(core_parse.intersection_points, 2): p0, p1 = core_parse.intersection_points[ key0], core_parse.intersection_points[key1] line = instantiators['line'](p0, p1) v0, v1 = core_parse.point_variables[key0], core_parse.point_variables[ key1] var = FormulaNode(signatures['Line'], [v0, v1]) if instance_exists(core_parse, line): points = {} for key in set(core_parse.intersection_points).difference( {key0, key1}): point = core_parse.intersection_points[key] if distance_between_line_and_point(line, point) <= eps: points[key] = point line_graph.add_edge(key0, key1, instance=line, points=points, variable=var) return line_graph
def _line_exists(diagram_parse, line): # TODO : smarter line_exists function needed (check continuity, etc.) eps = LINE_EPS multiplier = 1.0 assert isinstance(diagram_parse, CoreParse) pixels = diagram_parse.primitive_parse.image_segment_parse.diagram_image_segment.pixels near_pixels = set(pixel for pixel in pixels if distance_between_line_and_point(line, pixel) <= eps) length = line_length(line) ratio = float(len(near_pixels))/length if ratio < multiplier: return False return True
def _line_exists(diagram_parse, line): # TODO : smarter line_exists function needed (check continuity, etc.) eps = LINE_EPS multiplier = 1.0 assert isinstance(diagram_parse, CoreParse) pixels = diagram_parse.primitive_parse.image_segment_parse.diagram_image_segment.pixels near_pixels = set(pixel for pixel in pixels if distance_between_line_and_point(line, pixel) <= eps) length = line_length(line) ratio = float(len(near_pixels)) / length if ratio < multiplier: return False return True
def Secant(line, circle): d = distance_between_line_and_point(line, circle.center) return Ge(circle.radius, d)
def _distance_from_point(point, primitive): if isinstance(primitive, instantiators['line']): return distance_between_line_and_point(primitive, point) elif isinstance(primitive, instantiators['circle']): return distance_between_circle_and_point(primitive, point)
def test_distance_between_line_and_point(): a = instantiators['point'](0, 68) b = instantiators['point'](112, 18) c = instantiators['point'](0, 69) line = instantiators['line'](a, b) print(distance_between_line_and_point(line, c))
def _distance_from_point(point, primitive): if isinstance(primitive, instantiators['line']): return distance_between_line_and_point(primitive, point) elif isinstance(primitive, instantiators['circle']): return distance_between_circle_and_point(primitive, point)
def Tangent(line, circle): d = distance_between_line_and_point(line, circle.center) return Equals(d, circle.radius)
def test_distance_between_line_and_point(): a = instantiators['point'](0, 68) b = instantiators['point'](112, 18) c = instantiators['point'](0, 69) line = instantiators['line'](a, b) print(distance_between_line_and_point(line, c))
def Tangent(line, circle): d = distance_between_line_and_point(line, circle.center) return Equals(d, circle.radius)