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)
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)