Esempio n. 1
0
    def createPlacement(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        A1 = scene.free_point(label='A1')
        B1 = scene.free_point(label='B1')
        C1 = scene.free_point(label='C1')
        A1.inside_triangle_constraint(triangle)
        B1.inside_triangle_constraint(triangle)
        C1.inside_triangle_constraint(triangle)
        angleA = A.angle(B, C)
        angleA.ratio_constraint(A.angle(B, C1), 3)
        angleA.ratio_constraint(A.angle(C1, B1), 3)
        angleA.ratio_constraint(A.angle(B1, C), 3)
        angleB = B.angle(A, C)
        angleB.ratio_constraint(B.angle(C, A1), 3)
        angleB.ratio_constraint(B.angle(A1, C1), 3)
        angleB.ratio_constraint(B.angle(C1, A), 3)
        angleC = C.angle(A, B)
        angleC.ratio_constraint(C.angle(A, B1), 3)
        angleC.ratio_constraint(C.angle(B1, A1), 3)
        angleC.ratio_constraint(C.angle(A1, B), 3)

        return iterative_placement(scene)
Esempio n. 2
0
    def createPlacement(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points

        bisectorA = A.angle(B, C).bisector_line()
        bisectorB = B.angle(A, C).bisector_line()
        bisectorC = C.angle(A, B).bisector_line()
        X_bisector = bisectorA.intersection_point(bisectorB, label='X_bisector')
        Y_bisector = bisectorA.intersection_point(bisectorC, label='Y_bisector')

        altitudeA = A.line_through(scene.perpendicular_foot_point(A, B.line_through(C)))
        altitudeB = B.line_through(scene.perpendicular_foot_point(B, A.line_through(C)))
        altitudeC = C.line_through(scene.perpendicular_foot_point(C, A.line_through(B)))
        X_altitude = altitudeA.intersection_point(altitudeB, label='X_altitude')
        Y_altitude = altitudeA.intersection_point(altitudeC, label='Y_altitude')

        perpA = B.segment(C).perpendicular_bisector_line()
        perpB = A.segment(C).perpendicular_bisector_line()
        perpC = A.segment(B).perpendicular_bisector_line()
        X_perp = perpA.intersection_point(perpB, label='X_perp')
        Y_perp = perpA.intersection_point(perpC, label='Y_perp')

        medianA = A.line_through(B.segment(C).middle_point())
        medianB = B.line_through(A.segment(C).middle_point())
        medianC = C.line_through(A.segment(B).middle_point())
        X_median = medianA.intersection_point(medianB, label='X_median')
        Y_median = medianA.intersection_point(medianC, label='Y_median')

        return iterative_placement(scene)
Esempio n. 3
0
    def createPlacement(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        O = scene.circumcentre_point(triangle, label='O')

        return iterative_placement(scene)
Esempio n. 4
0
    def testTwoObtuseAngles(self):
        scene = Scene()

        A, B, C = scene.nondegenerate_triangle(labels=('A', 'B', 'C')).points
        A.angle(B, C).is_obtuse_constraint()
        B.angle(A, C).is_obtuse_constraint()

        explainer = Explainer(scene)
        self.assertRaises(ContradictionError, explainer.explain)
Esempio n. 5
0
    def createScene(self):
        scene = Scene()

        A, B, C = scene.nondegenerate_triangle(labels=('A', 'B', 'C')).points
        A.segment(C).perpendicular_constraint(B.segment(C),
                                              comment='Given: AC ⟂ BC')
        D = A.segment(B).middle_point(label='D')

        return scene
Esempio n. 6
0
    def createScene(self):
        scene = Scene()

        A, B, C = scene.nondegenerate_triangle(labels=('A', 'B', 'C')).points
        D = A.segment(B).free_point(label='D')
        E = A.segment(C).free_point(label='E')
        X = D.line_through(C).intersection_point(E.line_through(B), label='X')

        return scene
Esempio n. 7
0
    def createScene(self):
        scene = Scene()

        A = scene.free_point(label='A')
        B = scene.free_point(label='B')
        A.segment(B).middle_point(label='C')
        A.line_through(B, label='AB')

        return scene
Esempio n. 8
0
    def createPlacement(self):
        scene = Scene()

        A, B, C = scene.nondegenerate_triangle(labels=('A', 'B', 'C')).points
        A.segment(B).congruent_constraint(A.segment(C))
        altitude = A.perpendicular_line(B.line_through(C), label='AD')
        D = altitude.intersection_point(B.line_through(C, label='BC'))
        B.segment(C).ratio_constraint(A.segment(D), 2 / sp.sqrt(3))

        return iterative_placement(scene)
Esempio n. 9
0
    def createPlacement(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        D = scene.orthocentre_point(triangle)
        D.inside_triangle_constraint(triangle)
        A.segment(B).congruent_constraint(C.segment(D))

        return iterative_placement(scene)
Esempio n. 10
0
    def createScene(self):
        scene = Scene()

        A, B, C = scene.nondegenerate_triangle(labels=('A', 'B', 'C')).points
        F = B.segment(C).middle_point(label='F')
        D = scene.perpendicular_foot_point(C, A.line_through(B), label='D')
        E = scene.perpendicular_foot_point(B, A.line_through(C), label='E')
        G = scene.perpendicular_foot_point(F, D.line_through(E), label='G')

        return scene
Esempio n. 11
0
    def createScene(self):
        scene = Scene()

        A, B, C = scene.nondegenerate_triangle(labels=('A', 'B', 'C')).points
        D = scene.free_point(label='D')
        E = scene.free_point(label='E')
        A.segment(C).congruent_constraint(B.segment(C))
        A.segment(D).congruent_constraint(B.segment(D))
        A.segment(E).congruent_constraint(B.segment(E))

        return scene
Esempio n. 12
0
    def createPlacement(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        A.segment(B).ratio_constraint(B.segment(C), 2)
        A.segment(B).perpendicular_constraint(B.segment(C))
        F = scene.incentre_point(triangle, label='F')
        E = scene.perpendicular_foot_point(B, A.line_through(F), label='E')

        return iterative_placement(scene)
Esempio n. 13
0
    def createScene(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        D = scene.orthocentre_point(triangle, label='D')
        D.inside_triangle_constraint(triangle)
        H = A.line_through(D).intersection_point(B.line_through(C), label='H')
        G = C.line_through(D).intersection_point(A.line_through(B), label='G')
        A.segment(B).congruent_constraint(C.segment(D))

        return scene
Esempio n. 14
0
    def createPlacement(self):
        scene = Scene()

        A, B, C = scene.nondegenerate_triangle(labels=('A', 'B', 'C')).points
        A.distance_constraint(B, 5)
        C.distance_constraint(B, 3)
        C.distance_constraint(A, 4)
        D = scene.free_point(label='D')
        A.vector(D).parallel_constraint(C.vector(B))
        B.vector(D).parallel_constraint(C.vector(A))

        return iterative_placement(scene)
Esempio n. 15
0
    def createScene(self):
        scene = Scene()

        A = scene.free_point(label='A')
        B = scene.free_point(label='B')
        B.not_equal_constraint(A)
        C = scene.free_point(label='C')
        D = scene.free_point(label='D')
        C.collinear_constraint(A, B)
        D.collinear_constraint(A, B)

        return scene
Esempio n. 16
0
    def createPlacement(self):
        scene = Scene()

        A = scene.free_point(label='A', x=1, y=1)
        B = scene.free_point(label='B', x=5, y=-3)
        C = scene.free_point(label='C', x=3, y=10)
        D = scene.free_point(label='D', x=4, y=11)
        AB = A.line_through(B)
        CD = C.line_through(D)
        AB.intersection_point(CD, label='E')

        return iterative_placement(scene)
Esempio n. 17
0
    def createScene(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        altitudeA = scene.altitude(triangle, A)
        altitudeB = scene.altitude(triangle, B)
        A1 = altitudeA.intersection_point(B.line_through(C), label='A1')
        B1 = altitudeB.intersection_point(A.line_through(C), label='B1')

        C.angle(A, B).is_acute_constraint()

        return scene
Esempio n. 18
0
    def createPlacement(self):
        scene = Scene()

        A = scene.free_point(label='A')
        B = scene.free_point(label='B')
        C = scene.free_point(label='C')
        M = A.segment(B).middle_point(label='M')
        l = C.line_through(M)
        D = l.free_point(label='D')
        para = scene.parallel_line(A.line_through(B), D)
        A1 = para.intersection_point(A.line_through(C), label='A1')
        B1 = para.intersection_point(B.line_through(C), label='B1')

        return iterative_placement(scene)
Esempio n. 19
0
    def createScene(self):
        scene = Scene()

        A = scene.free_point(label='A')
        B = scene.free_point(label='B')
        C = scene.free_point(label='C')
        D = scene.free_point(label='D')
        E = scene.free_point(label='E')
        F = scene.free_point(label='F')
        A.not_equal_constraint(B)
        A.not_equal_constraint(C)
        A.collinear_constraint(B, C)
        E.opposite_side_constraint(D, A.line_through(B))
        F.same_side_constraint(D, A.line_through(B))

        return scene
Esempio n. 20
0
 def napoleonic(A: Scene.Point, B: Scene.Point, C: Scene.Point):
     c0 = A.circle_through(B)
     c1 = B.circle_through(A)
     line = A.line_through(B, layer='auxiliary')
     V = c0.intersection_point(c1, label=C.label + '1')
     equilateral = Scene.Triangle(A, B, V)
     V.opposite_side_constraint(C, line)
     scene.centroid_point(equilateral, label=C.label + '2')
Esempio n. 21
0
    def createScene(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=['A', 'B', 'C'])
        A, B, C = triangle.points

        def napoleonic(A, B, C):
            equilateral = scene.equilateral_triangle(A, B, C.label + '1')
            _, _, V = equilateral.points
            line = A.line_through(B, layer='auxiliary')
            comment = Comment('$%{triangle:equilateral}$ is facing away from $%{triangle:triangle}$', {'equilateral': equilateral, 'triangle': triangle})
            V.opposite_side_constraint(C, line, comment=comment)
            D = scene.incentre_point(equilateral, label=C.label + '2')

        napoleonic(A, B, C)
        napoleonic(C, A, B)
        napoleonic(B, C, A)

        return scene
Esempio n. 22
0
    def createPlacement(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points

        def napoleonic(A: Scene.Point, B: Scene.Point, C: Scene.Point):
            c0 = A.circle_through(B)
            c1 = B.circle_through(A)
            line = A.line_through(B, layer='auxiliary')
            V = c0.intersection_point(c1, label=C.label + '1')
            equilateral = Scene.Triangle(A, B, V)
            V.opposite_side_constraint(C, line)
            scene.centroid_point(equilateral, label=C.label + '2')

        napoleonic(A, B, C)
        napoleonic(C, A, B)
        napoleonic(B, C, A)

        return iterative_placement(scene)
Esempio n. 23
0
    def createPlacement(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        A.distance_constraint('B', 5)
        C.distance_constraint('B', 4)
        C.distance_constraint('A', 3)
        scene.incircle(triangle, label='incircle')
        scene.circumcircle(triangle, label='circumcircle')

        return iterative_placement(scene)
Esempio n. 24
0
def napoleonic(A, B, C):
    circleAB = A.circle_through(B, layer='invisible')
    circleBA = B.circle_through(A, layer='invisible')
    V = circleAB.intersection_point(circleBA, label=C.label + '_1')
    equilateral = Scene.Triangle(A, B, V)
    A.scene.equilateral_constraint(equilateral,
                                   comment=LazyComment(
                                       'Given: %s is equilateral',
                                       equilateral))
    line = A.line_through(B, layer='auxiliary')
    V.opposite_side_constraint(C,
                               line,
                               comment=LazyComment(
                                   'Given: %s is outward of %s', V, triangle))
    D = scene.circumcentre_point(equilateral, label=C.label + '_2')
Esempio n. 25
0
    def createScene(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        A.segment(B).perpendicular_constraint(A.segment(C))
        I = scene.incentre_point(triangle, label='I')
        J = scene.orthocentre_point(Scene.Triangle(A, B, I), label='J')

        return scene
Esempio n. 26
0
    def createScene(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        triangle2 = Scene.Triangle(
            *[side.middle_point() for side in triangle.sides])
        D = scene.circumcentre_point(triangle, label='D')
        E = scene.orthocentre_point(triangle2, label='E')

        return scene
Esempio n. 27
0
    def createScene(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        scene.equilateral_constraint(triangle)
        D = B.translated_point(A.vector(B), 2, label='D')
        F = scene.perpendicular_foot_point(D, B.line_through(C), label='F')

        return scene
Esempio n. 28
0
    def createScene(self):
        scene = Scene()

        triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
        A, B, C = triangle.points
        A.segment(B).perpendicular_constraint(A.segment(C))
        I = scene.incentre_point(triangle, label='I')
        J = scene.orthocentre_point(Scene.Triangle(A, B, I), label='J')

        # Additional constructions
        D = A.line_through(B).intersection_point(I.line_through(J), label='D')
        E = A.line_through(I).intersection_point(B.line_through(J), label='E')

        return scene
Esempio n. 29
0
 def setUp(self):
     scene = Scene()
     A = scene.free_point(label='A')
     B = scene.free_point(label='B')
     C = scene.free_point(label='C')
     D = scene.free_point(label='D')
     E = scene.free_point(label='E')
     F = scene.free_point(label='F')
     G = scene.free_point(label='G')
     H = scene.free_point(label='H')
     self.AB = A.segment(B)
     self.CD = C.segment(D)
     self.EF = E.segment(F)
     self.GH = G.segment(H)
     self.startTime = time.time()
Esempio n. 30
0
    def createPlacement(self):
        scene = Scene()

        A = scene.free_point(label='A')
        B = scene.free_point(label='B')
        C = scene.free_point(label='C')
        D = scene.free_point(label='D')
        E = scene.free_point(label='E')
        scene.convex_polygon_constraint(A, B, C, D, E)
        A.segment(B).congruent_constraint(B.segment(C))
        A.segment(B).congruent_constraint(C.segment(D))
        A.segment(B).congruent_constraint(D.segment(E))
        A.segment(B).congruent_constraint(E.segment(A))
        A.segment(C).congruent_constraint(B.segment(D))
        A.segment(C).congruent_constraint(C.segment(E))
        A.segment(C).congruent_constraint(D.segment(A))
        A.segment(C).congruent_constraint(E.segment(B))

        return iterative_placement(scene)