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


def napoleonic(A, B, C):
    equilateral = scene.equilateral_triangle(A, B, '%s_1' % C.label)
    _, _, C1 = equilateral.points
    C1.comment = Comment(
        'Third vertex of equilateral triangle with base $%{segment:AB}$',
        {'AB': A.segment(B)})
    line = A.line_through(B, layer='auxiliary')
    comment = Comment(
        '$%{triangle:equilateral}$ is facing away from $%{triangle:triangle}$',
        {
            'equilateral': equilateral,
            'triangle': triangle
        })
    C1.opposite_side_constraint(C, line, comment=comment)
    D = scene.circumcentre_point(equilateral, label='%s_2' % C.label)


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

prop = EquilateralTriangleProperty(
    (scene.get('A_2'), scene.get('B_2'), scene.get('C_2')))

run_sample(scene, prop)
Beispiel #2
0
scene = Scene()

triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
D = scene.orthocentre_point(triangle, label='D')
D.inside_triangle_constraint(triangle)
A, B, C = triangle.points
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), comment='given')

#Proof
# +* 1* |AB| = |CD|                                *given
# +* 2* ∠ A H B = 90º                              *given (altitude)
# +* 3* ∠ A H C = 90º                              *given (altitude)
# +* 4* ∠ C G B = 90º                              *given (altitude)
# +* 5* ∠ A H B = ∠ A H C (a.k.a ∠ D H C) = 90º    *2, *3             same arcs => equal angles
# +* 6* ∠ A H B = ∠ C G B                          *2, *4             same arcs => equal angles
# +* 7* ∠ A B H = ∠ C B G                          *same angle
# +* 8* △ A B H ∼ △ C B G                          *6, *7             two angles
# +* 9* ∠ H A B = ∠ G C B (a.k.a. ∠ D C H)         *8                 similar triangles => equal angles
# +*10* ∠ H A B = ∠ D C H                          *9                 similar triangles => equal angles
# +*11* △ A B H ∼ △ C D H                          *5, *10            two anlges
# +*12* △ A B H = △ C D H                          *1, *11            similarity, side
# +*13* |AH| = |CH|                                *12                equal triangles => equal sides
# +*14* isosceles △ A H C                          *13                equal sides => isosceles
# +*15* ∠ A C H = (180º - ∠ A H C) / 2 = 45º       *14                isocseles
# +*16* ∠ A C B = ∠ A C H                          *same angle
# +*17* ∠ A C B = ∠ A C H = 45º                    *15, *16           transitivity

run_sample(scene, C.angle(A, B))
from sandbox import Scene

from runner import run_sample

scene = Scene()

triangle = scene.nondegenerate_triangle(labels=('A', 'B', 'C'))
triangle.sides[0].congruent_constraint(triangle.sides[1])
triangle.sides[0].congruent_constraint(triangle.sides[2])
scene.incentre_point(triangle, label='D')

run_sample(scene)
altitudeA = scene.altitude(triangle, A)
A1 = altitudeA.intersection_point(B.line_through(C), label='A_1')
A2 = altitudeA.intersection_point(circ, label='A_2')
A2.not_equal_constraint(A)

altitudeB = scene.altitude(triangle, B)
B1 = altitudeB.intersection_point(A.line_through(C), label='B_1')
B2 = altitudeB.intersection_point(circ, label='B_2')
B2.not_equal_constraint(B)

altitudeC = scene.altitude(triangle, C)
C1 = altitudeC.intersection_point(B.line_through(A), label='C_1')
C2 = altitudeC.intersection_point(circ, label='C_2')
C2.not_equal_constraint(C)

#A.angle(B, C).is_obtuse_constraint()
#A.angle(B, C).is_right_constraint()
A.angle(B, C).is_acute_constraint(comment='assumption')
B.angle(A, C).is_acute_constraint(comment='assumption')
C.angle(B, A).is_acute_constraint(comment='assumption')

props = (
    AngleRatioProperty(B.angle(B1, C), A.angle(B1, B2), 1),
    AngleRatioProperty(A.angle(B1, H), B.angle(B1, C), 1),
    AngleRatioProperty(A.angle(B1, H), A.angle(B1, B2), 1),
    ProportionalLengthsProperty(B1.segment(H), B1.segment(B2), 1),
)

run_sample(scene, *props)