def is_isosceles(graph, this_triangle):
    is_isosceles_result = False
    vertex_point = ''
    aside_points = ()
    """ every vertex """
    for point_vertex in this_triangle:
        point_aside = tuple_del(this_triangle, point_vertex)
        if (graph.query(
                equal(segment(point_aside[0], point_vertex),
                      segment(point_aside[1], point_vertex)),
                'segment')) or (graph.query(
                    equal(angle(point_vertex, point_aside[0], point_aside[1]),
                          angle(point_vertex, point_aside[1], point_aside[0])),
                    'angle')):
            is_isosceles_result = True
            vertex_point = point_vertex
            aside_points = point_aside
            return is_isosceles_result, vertex_point, aside_points
    """ return judge result """
    return is_isosceles_result, vertex_point, aside_points
예제 #2
0
 def quadrilateral_theorem_transform(graph):
     triangles_list = graph.triangles_list
     for this_triangle in triangles_list:
         out_points = tuple_except_tuple(graph.points.keys(),
                                         this_triangle)
         for point_vertex in this_triangle:
             point_aside = tuple_del(this_triangle, point_vertex)
             for point_out in out_points:
                 """ coexist with a circle """
                 if graph.query(
                         equal(
                             sum_units(
                                 angle(point_out, point_vertex,
                                       point_aside[0]),
                                 angle(point_out, point_vertex,
                                       point_aside[1])),
                             angle(point_aside[0], point_vertex,
                                   point_aside[1])), 'angle'):
                     if graph.query(equal(sum_units(angle(point_aside[0], point_vertex, point_aside[1]),
                                                    angle(point_aside[0], point_out, point_aside[1])),
                                          degree(180)), 'angle') or \
                        graph.query(equal(angle(point_out, point_vertex, point_aside[1]),
                                          angle(point_out, point_aside[0], point_aside[1])), 'angle') or \
                        graph.query(equal(angle(point_out, point_vertex, point_aside[0]),
                                          angle(point_out, point_aside[1], point_aside[0])), 'angle'):
                         graph.add_equal(
                             equal(
                                 angle(point_out, point_vertex,
                                       point_aside[1]),
                                 angle(point_out, point_aside[0],
                                       point_aside[1])), 'angle')
                         graph.add_equal(
                             equal(
                                 angle(point_out, point_vertex,
                                       point_aside[0]),
                                 angle(point_out, point_aside[1],
                                       point_aside[0])), 'angle')
                         graph.add_equal(
                             equal(
                                 angle(point_vertex, point_out,
                                       point_aside[1]),
                                 angle(point_vertex, point_aside[0],
                                       point_aside[1])), 'angle')
                         graph.add_equal(
                             equal(
                                 angle(point_vertex, point_out,
                                       point_aside[0]),
                                 angle(point_vertex, point_aside[1],
                                       point_aside[0])), 'angle')
def is_congruent(graph, triangle_1, triangle_2):
    is_congruent_result = False
    three_points_1 = ()
    three_points_2 = ()
    """ every double vertex """
    for point_vertex_1 in triangle_1:
        point_aside_1 = tuple_del(triangle_1, point_vertex_1)
        for point_vertex_2 in triangle_2:
            point_aside_2 = tuple_del(triangle_2, point_vertex_2)
            """ A or S """
            if graph.query(
                    equal(
                        angle(point_aside_1[0], point_vertex_1,
                              point_aside_1[1]),
                        angle(point_aside_2[0], point_vertex_2,
                              point_aside_2[1])), 'angle'):
                for point_aside_1_1 in point_aside_1:
                    point_aside_1_2 = tuple_del(point_aside_1,
                                                point_aside_1_1)[0]
                    point_aside_2_1 = point_aside_2[0]
                    point_aside_2_2 = point_aside_2[1]
                    """ AS """
                    if graph.query(
                            equal(segment(point_aside_1_1, point_vertex_1),
                                  segment(point_aside_2_1, point_vertex_2)),
                            'segment'):
                        """ ASS """
                        if graph.query(
                                equal(segment(point_aside_1_2, point_vertex_1),
                                      segment(point_aside_2_2,
                                              point_vertex_2)), 'segment'):
                            is_congruent_result = True
                            three_points_1 = (point_aside_1_1, point_vertex_1,
                                              point_aside_1_2)
                            three_points_2 = (point_aside_2_1, point_vertex_2,
                                              point_aside_2_2)
                            return is_congruent_result, three_points_1, three_points_2
            elif graph.query(
                    equal(segment(point_aside_1[0], point_aside_1[1]),
                          segment(point_aside_2[0], point_aside_2[1])),
                    'segment'):
                for point_aside_1_1 in point_aside_1:
                    point_aside_1_2 = tuple_del(point_aside_1,
                                                point_aside_1_1)[0]
                    point_aside_2_1 = point_aside_2[0]
                    point_aside_2_2 = point_aside_2[1]
                    """ SS or SA"""
                    if graph.query(
                            equal(segment(point_aside_1_1, point_vertex_1),
                                  segment(point_aside_2_1, point_vertex_2)),
                            'segment'):
                        """ SSS """
                        if graph.query(
                                equal(segment(point_aside_1_2, point_vertex_1),
                                      segment(point_aside_2_2,
                                              point_vertex_2)), 'segment'):
                            is_congruent_result = True
                            three_points_1 = (point_aside_1_1, point_vertex_1,
                                              point_aside_1_2)
                            three_points_2 = (point_aside_2_1, point_vertex_2,
                                              point_aside_2_2)
                            return is_congruent_result, three_points_1, three_points_2
                    elif graph.query(
                            equal(
                                angle(point_vertex_1, point_aside_1_1,
                                      point_aside_1_2),
                                angle(point_vertex_2, point_aside_2_1,
                                      point_aside_2_2)), 'angle'):
                        """ SAA """
                        if graph.query(
                                equal(
                                    angle(point_vertex_1, point_aside_1_2,
                                          point_aside_1_1),
                                    angle(point_vertex_2, point_aside_2_2,
                                          point_aside_2_1)), 'angle'):
                            is_congruent_result = True
                            three_points_1 = (point_aside_1_1, point_vertex_1,
                                              point_aside_1_2)
                            three_points_2 = (point_aside_2_1, point_vertex_2,
                                              point_aside_2_2)
                            return is_congruent_result, three_points_1, three_points_2
    """ return judge result """
    return is_congruent_result, three_points_1, three_points_2
예제 #4
0
 def space_and_collinear_transform(graph):
     """ find collinear """
     three_points_list = list(combinations(graph.points.keys(), 3))
     triangles_list = three_points_list.copy()
     collinear_list = []
     for this_three_point in three_points_list:
         yes_collinear, vertex_point, aside_points = is_collinear(
             graph, this_three_point)
         if yes_collinear:
             triangles_list.remove(this_three_point)
             collinear_list.append(
                 (aside_points[0], vertex_point, aside_points[1]))
     graph.triangles_list = triangles_list
     graph.collinear_list = collinear_list
     """ collinear transform """
     for this_collinear in collinear_list:
         graph.add_equal(
             equal(
                 sum_units(
                     segment(this_collinear[0], this_collinear[1]),
                     segment(this_collinear[2], this_collinear[1])),
                 segment(this_collinear[0], this_collinear[2])),
             'segment')
         out_points = tuple_except_tuple(graph.points.keys(),
                                         this_collinear)
         for point_out in out_points:
             if not is_collinear(
                     graph,
                 (point_out, this_collinear[0], this_collinear[1]))[0]:
                 graph.add_equal(
                     equal(
                         sum_units(
                             angle(point_out, this_collinear[1],
                                   this_collinear[0]),
                             angle(point_out, this_collinear[1],
                                   this_collinear[2])), degree(180)),
                     'angle')
                 graph.add_equal(
                     equal(
                         angle(point_out, this_collinear[0],
                               this_collinear[1]),
                         angle(point_out, this_collinear[0],
                               this_collinear[2])), 'angle')
                 graph.add_equal(
                     equal(
                         angle(point_out, this_collinear[2],
                               this_collinear[1]),
                         angle(point_out, this_collinear[2],
                               this_collinear[0])), 'angle')
     """ not collinear transform """
     for this_triangle in triangles_list:
         out_points = tuple_except_tuple(graph.points.keys(),
                                         this_triangle)
         for point_vertex in this_triangle:
             point_aside = tuple_del(this_triangle, point_vertex)
             for point_out in out_points:
                 degree_1 = cal_an_angle_degree(graph, point_out,
                                                point_vertex,
                                                point_aside[0])
                 degree_2 = cal_an_angle_degree(graph, point_out,
                                                point_vertex,
                                                point_aside[1])
                 degree_sum = cal_an_angle_degree(
                     graph, point_aside[0], point_vertex,
                     point_aside[1])
                 if degree_1 > 5.0 and degree_2 > 5.0 and abs(
                         degree_sum - degree_1 - degree_2) < 2.0:
                     graph.add_equal(
                         equal(
                             sum_units(
                                 angle(point_out, point_vertex,
                                       point_aside[0]),
                                 angle(point_out, point_vertex,
                                       point_aside[1])),
                             angle(point_aside[0], point_vertex,
                                   point_aside[1])), 'angle')
예제 #5
0
 def triangle_theorem_transform(graph):
     triangles_list = graph.triangles_list
     triangles_num = len(triangles_list)
     for no_1 in range(triangles_num):
         this_triangle = triangles_list[no_1]
         """ interior angle summation 180° """
         graph.add_equal(
             equal(
                 sum_units(
                     angle(this_triangle[1], this_triangle[0],
                           this_triangle[2]),
                     angle(this_triangle[0], this_triangle[1],
                           this_triangle[2]),
                     angle(this_triangle[0], this_triangle[2],
                           this_triangle[1])), degree(180)), 'angle')
         """ isosceles """
         yes_isosceles, vertex_point, aside_points = is_isosceles(
             graph, this_triangle)
         if yes_isosceles:
             graph.add_equal(
                 equal(segment(vertex_point, aside_points[0]),
                       segment(vertex_point, aside_points[1])),
                 'segment')
             graph.add_equal(
                 equal(
                     angle(vertex_point, aside_points[0],
                           aside_points[1]),
                     angle(vertex_point, aside_points[1],
                           aside_points[0])), 'angle')
         """ congruent and similar """
         for no_2 in range(no_1 + 1, triangles_num):
             another_triangle = triangles_list[no_2]
             """ congruent """
             yes_congruent, three_points_1, three_points_2 = is_congruent(
                 graph, this_triangle, another_triangle)
             if yes_congruent:
                 graph.add_equal(
                     equal(
                         segment(three_points_1[0], three_points_1[1]),
                         segment(three_points_2[0], three_points_2[1])),
                     'segment')
                 graph.add_equal(
                     equal(
                         segment(three_points_1[0], three_points_1[2]),
                         segment(three_points_2[0], three_points_2[2])),
                     'segment')
                 graph.add_equal(
                     equal(
                         segment(three_points_1[1], three_points_1[2]),
                         segment(three_points_2[1], three_points_2[2])),
                     'segment')
                 graph.add_equal(
                     equal(
                         angle(three_points_1[1], three_points_1[0],
                               three_points_1[2]),
                         angle(three_points_2[1], three_points_2[0],
                               three_points_2[2])), 'angle')
                 graph.add_equal(
                     equal(
                         angle(three_points_1[0], three_points_1[1],
                               three_points_1[2]),
                         angle(three_points_2[0], three_points_2[1],
                               three_points_2[2])), 'angle')
                 graph.add_equal(
                     equal(
                         angle(three_points_1[0], three_points_1[2],
                               three_points_1[1]),
                         angle(three_points_2[0], three_points_2[2],
                               three_points_2[1])), 'angle')
             """ similar """
             yes_similar, three_points_1, three_points_2 = is_similar(
                 graph, this_triangle, another_triangle)
             if yes_similar:
                 graph.add_equal(
                     equal(
                         multiply_units(
                             segment(three_points_1[0],
                                     three_points_1[1]),
                             segment(three_points_2[1],
                                     three_points_2[2])),
                         multiply_units(
                             segment(three_points_1[1],
                                     three_points_1[2]),
                             segment(three_points_2[0],
                                     three_points_2[1]))), 'segment')
                 graph.add_equal(
                     equal(
                         multiply_units(
                             segment(three_points_1[0],
                                     three_points_1[1]),
                             segment(three_points_2[0],
                                     three_points_2[2])),
                         multiply_units(
                             segment(three_points_1[0],
                                     three_points_1[2]),
                             segment(three_points_2[0],
                                     three_points_2[1]))), 'segment')
                 graph.add_equal(
                     equal(
                         multiply_units(
                             segment(three_points_1[0],
                                     three_points_1[2]),
                             segment(three_points_2[1],
                                     three_points_2[2])),
                         multiply_units(
                             segment(three_points_1[1],
                                     three_points_1[2]),
                             segment(three_points_2[0],
                                     three_points_2[2]))), 'segment')
                 graph.add_equal(
                     equal(
                         angle(three_points_1[1], three_points_1[0],
                               three_points_1[2]),
                         angle(three_points_2[1], three_points_2[0],
                               three_points_2[2])), 'angle')
                 graph.add_equal(
                     equal(
                         angle(three_points_1[0], three_points_1[1],
                               three_points_1[2]),
                         angle(three_points_2[0], three_points_2[1],
                               three_points_2[2])), 'angle')
                 graph.add_equal(
                     equal(
                         angle(three_points_1[0], three_points_1[2],
                               three_points_1[1]),
                         angle(three_points_2[0], three_points_2[2],
                               three_points_2[1])), 'angle')
예제 #6
0
 def complex_units_equal_transform(graph, equals_list, equal_type):
     for each_equal in equals_list:
         for each_complex_unit in each_equal:
             if is_complex_type(each_complex_unit):
                 complex_type = get_unit_type(each_complex_unit)
                 """ replace sub unit """
                 """ AB+BM=MN, BM=BC ---> AB+BM=AB+BC=MN """
                 """ AB*BM=MN*ML, BM=BC ---> AB*BM=AB*BC=MN*ML """
                 """ AB*AB=MN*ML, AB=BC ---> AB*AB=AB*BC=BC*BC=MN*ML """
                 for each_sub_unit in get_complexunit_set(
                         each_complex_unit):
                     for each_another_equal in equals_list:
                         if each_sub_unit in each_another_equal:
                             for each_another_sub_unit in get_equal_except_unit(
                                     each_another_equal, each_sub_unit):
                                 new_complex_unit = complex_units(
                                     complex_type,
                                     get_complexunit_except_unit(
                                         each_complex_unit,
                                         each_sub_unit),
                                     each_another_sub_unit)
                                 if equal_type == 'angle' and get_unit_len(
                                         new_complex_unit
                                 ) > deduce_config[
                                         'angle_complex_max_len']:
                                     continue
                                 graph.add_equal(
                                     equal(new_complex_unit,
                                           each_complex_unit),
                                     equal_type)
                 """ eliminate sub unit """
                 """ AB+BM=AB+BC ---> BM=BC ; AB+BM+MN=AB+BC ---> BM+MN=BC """
                 """ AB*BM=AB*BC ---> BM=BC ; AB*BM*MN=AB*BC*DE ---> BM*MN=BC*DE """
                 """ AB*AB=AB*BC ---> AB=BC ; AB*AB*MN=AB*BC*DE ---> AB*MN=BC*DE """
                 for each_another_complex_unit in get_equal_except_unit(
                         each_equal, each_complex_unit):
                     if get_unit_type(
                             each_another_complex_unit) == complex_type:
                         if get_unit_len(
                                 get_complexunit_inner_complexunit(
                                     each_complex_unit,
                                     each_another_complex_unit)) >= 1:
                             graph.add_equal(
                                 equal(
                                     get_complexunit_except_unit(
                                         each_complex_unit,
                                         each_another_complex_unit),
                                     get_complexunit_except_unit(
                                         each_another_complex_unit,
                                         each_complex_unit)),
                                 equal_type)
                 """ multiply allocate """
                 """ (AE+EB)*AC=AB*AC ---> (AE+EB)*AC=AE*AC+EB*AC=AB*AC """
                 """ (AE+EM+MB)*AC=AB*AC ---> (AE+EM+MB)*AC=AE*AC+EM*AC+MB*AC=AB*AC """
                 """ (AE+AE+MB)*AC=AB*AC ---> (AE+AE+MB)*AC=AE*AC+AE*AC+MB*AC=AB*AC """
                 if complex_type == 'multiply':
                     for each_sub_unit in get_complexunit_set(
                             each_complex_unit):
                         if get_unit_type(each_sub_unit) == 'sum':
                             excepted_unit = get_complexunit_except_unit(
                                 each_complex_unit, each_sub_unit)
                             allocated_complex_unit = sum_units()
                             for each_sub_sub_unit in get_complexunit_set(
                                     each_sub_unit):
                                 allocated_complex_unit = sum_units(
                                     allocated_complex_unit,
                                     multiply_units(
                                         each_sub_sub_unit,
                                         excepted_unit))
                             graph.add_equal(
                                 equal(allocated_complex_unit,
                                       each_complex_unit), equal_type)
                 """ multiply associate """
                 """ AE*AC+EB*AC=AB*AC ---> AE*AC+EB*AC=(AE+EB)*AC=AB*AC """
                 """ AE*AC+EM*AC+MB*AC=AB*AC ---> AE*AC+EM*AC+MB*AC=(AE+EM)*AC+MB*AC=AB*AC """
                 """ (AE+EM)*AC+MB*AC=AB*AC ---> (AE+EM)*AC+MB*AC=(AE+EM+MB)*AC=AB*AC """
                 if complex_type == 'sum':
                     for each_sub_unit in get_complexunit_set(
                             each_complex_unit):
                         if get_unit_type(each_sub_unit) == 'multiply':
                             excepted_unit = get_complexunit_except_unit(
                                 each_complex_unit, each_sub_unit)
                             if get_unit_type(excepted_unit) == 'sum':
                                 for each_another_sub_unit in get_complexunit_set(
                                         excepted_unit):
                                     if get_unit_type(
                                             each_another_sub_unit
                                     ) == 'multiply':
                                         inner_unit = get_complexunit_inner_complexunit(
                                             each_sub_unit,
                                             each_another_sub_unit)
                                         excepted_2_unit = get_complexunit_except_unit(
                                             excepted_unit,
                                             each_another_sub_unit)
                                         for inner_sub_unit in get_unit_flatten_set(
                                                 inner_unit,
                                                 'multiply'):
                                             associated_complex_unit = sum_units(
                                                 multiply_units(
                                                     inner_sub_unit,
                                                     sum_units(
                                                         get_complexunit_except_unit(
                                                             each_sub_unit,
                                                             inner_sub_unit
                                                         ),
                                                         get_complexunit_except_unit(
                                                             each_another_sub_unit,
                                                             inner_sub_unit
                                                         ))),
                                                 excepted_2_unit)
                                             graph.add_equal(
                                                 equal(
                                                     associated_complex_unit,
                                                     each_complex_unit),
                                                 equal_type)
                             elif get_unit_type(
                                     excepted_unit) == 'multiply':
                                 inner_unit = get_complexunit_inner_complexunit(
                                     each_sub_unit, excepted_unit)
                                 for inner_sub_unit in get_unit_flatten_set(
                                         inner_unit, 'multiply'):
                                     associated_complex_unit = multiply_units(
                                         inner_sub_unit,
                                         sum_units(
                                             get_complexunit_except_unit(
                                                 each_sub_unit,
                                                 inner_sub_unit),
                                             get_complexunit_except_unit(
                                                 excepted_unit,
                                                 inner_sub_unit)))
                                     graph.add_equal(
                                         equal(associated_complex_unit,
                                               each_complex_unit),
                                         equal_type)