Реши 3 задачу по геометрии без координат!
創建於:2026年4月15日
使用 GPT-5.4 Thinking 回答 Chat01
創建於:2026年4月15日
使用 GPT-5.4 Thinking 回答 Chat01
Реши 3 задачу по геометрии без координат!
pythonimport sympy as sp # choose sample b=7,c=5 angle A=60 b=7 # AC c=5 # AB a=(b*b+c*c-b*c)**0.5 a 6.244997998398398
pythonsqrt3=sp.sqrt(3) A=sp.Point(0,0) B=sp.Point(c,0) C=sp.Point(b/2,b*sqrt3/2) a=sp.sqrt(b**2+c**2-b*c) # param point on BC at distance t from B def point_on_BC_from_B(t): return sp.Point(B.x + (C.x-B.x)*t/a, B.y + (C.y-B.y)*t/a) X=point_on_BC_from_B(c/2) Y=point_on_BC_from_B(a-b/2) sp.simplify(X.x), sp.simplify(X.y), sp.simplify(Y.x), sp.simplify(Y.y) (5 - 5*sqrt(39)/52, 35*sqrt(13)/52, 7*sqrt(39)/52 + 7/2, -49*sqrt(13)/52 + 7*sqrt(3)/2)
python[X.evalf() for X in (X,Y,C)] [Point2D(4.39951942323092, 2.42681335848538), Point2D(4.34067280747671, 2.66463912461154), Point2D(3.50000000000000, 6.06217782649107)]
python# compute incenter and excenters triangle = sp.geometry.Triangle(A,B,C) I = triangle.incenter r = triangle.incircle.radius I, sp.N(I), sp.N(r) (Point2D(6 - sqrt(39)/2, -sqrt(13)/2 + 2*sqrt(3)), Point2D(2.87750100080080, 1.66132597740576), 1.66132597740576)
pythonexc = triangle.excircles [(e.center.evalf(), e.radius.evalf()) for e in exc]
pythonimport sympy as sp b=sp.Integer(7); c=sp.Integer(5); a=sp.sqrt(39) A=sp.Point(0,0) B=sp.Point(c,0) C=sp.Point(b/2,b*sp.sqrt(3)/2) def bary_point(weights, points=[A,B,C]): sx=sum(w*p.x for w,p in zip(weights,points)) sy=sum(w*p.y for w,p in zip(weights,points)) s=sum(weights) return sp.Point(sp.simplify(sx/s), sp.simplify(sy/s)) Ia=bary_point([-a,b,c]) Ib=bary_point([a,-b,c]) Ic=bary_point([a,b,-c]) Ia.evalf(), Ib.evalf(), Ic.evalf() (Point2D(9.12249899919920, 5.26687725286975), Point2D(-4.12249899919920, 7.14037772076486), Point2D(2.12249899919920, -3.67627610562711))
pythons=(a+b+c)/2 area = b*c*sp.sqrt(3)/4 r = sp.simplify(area/s) ra = sp.simplify(area/(s-a)) rb = sp.simplify(area/(s-b)) rc = sp.simplify(area/(s-c)) sp.N(r), sp.N(ra), sp.N(rb), sp.N(rc) (1.66132597740576, 5.26687725286975, 7.14037772076486, 3.67627610562711)
pythonimport sympy as sp, math # numeric values b=7.0; c=5.0; a=math.sqrt(b*b+c*c-b*c) A=(0.0,0.0); B=(c,0.0); C=(b/2,b*math.sqrt(3)/2) def pt_from_B(t): return (B[0]+(C[0]-B[0])*t/a, B[1]+(C[1]-B[1])*t/a) X=pt_from_B(c/2) Y=pt_from_B(a-b/2) X,Y ((4.399519423230923, 2.426813358485377), (4.340672807476707, 2.664639124611542))
pythonimport numpy as np, math X=np.array(X); Y=np.array(Y) mid=(X+Y)/2 v=Y-X d=np.array([-v[1], v[0]]) # direction perp d=d/np.linalg.norm(d) I=np.array([2.87750100080080, 1.66132597740576]); r=1.66132597740576 Ia=np.array([9.12249899919920,5.26687725286975]); ra=5.26687725286975 Ib=np.array([-4.12249899919920,7.14037772076486]); rb=7.14037772076486 Ic=np.array([2.12249899919920,-3.67627610562711]); rc=3.67627610562711 def check(E,er): arr=[] for t in np.linspace(-50,50,20001): O=mid+t*d R=np.linalg.norm(O-X) vals=[] for s1 in [1,-1]: for s2 in [1,-1]: vals.append((abs
pythont=sp.symbols('t', real=True) mid_sp = sp.Point(*map(sp.nsimplify,mid)) d_sp = sp.Point(*map(sp.nsimplify,d)) O = sp.Point(mid[0] + t*d[0], mid[1] + t*d[1]) R = sp.sqrt((O.x-X[0])**2 + (O.y-X[1])**2) eqI = sp.expand((sp.sqrt((O.x-I[0])**2 + (O.y-I[1])**2)-R)**2 - r**2) eqA = sp.expand((sp.sqrt((O.x-Ia[0])**2 + (O.y-Ia[1])**2)-R)**2 - ra**2) # nsolve combinations on polynomial-like but with sqrts for guess in [-20,-10,-5,-2,-1,0,1,2,5,10,20]: try: root=sp.nsolve([eqI,eqA],[t],[guess], tol=1e-14, maxsteps=100) print("guess",guess,root) except Exception as e: pass
pythondef solve_t(E,er): eqE = sp.expand((sp.sqrt((O.x-E[0])**2 + (O.y-E[1])**2)-R)**2 - er**2) roots=set() for guess in [-10,-5,-2,-1,-.5,0,.5,1,2,5,10]: try: root=float(sp.nsolve([eqI,eqE],[t],[guess], tol=1e-16, maxsteps=100)[0]) if abs(root)<1e6: roots.add(round(root,12)) except Exception as e: pass return roots for E,er,name in [(Ia,ra,'a'),(Ib,rb,'b'),(Ic,rc,'c')]: print(name, solve_t(E,er))
pythontval=-0.0707248301631137 O_num=mid+tval*d R_num=np.linalg.norm(O_num-X) O_num,R_num (array([4.4387505, 2.5627138]), np.float64(0.14144966032623316))
pythonnp.linalg.norm(X-Y) np.float64(0.24499799839839853)
pythondef distpt(P,Q): return float(np.linalg.norm(np.array(P)-np.array(Q))) for P,name in [(I,'I'),(Ia,'Ia')]: print(name, distpt(O_num,P), "difference", distpt(O_num,P)-R_num) # collinearity def area2(P,Q,R): P=np.array(P);Q=np.array(Q);R=np.array(R) return np.cross(Q-P,R-P) print("collinearity I O Ia", area2(I,O_num,Ia))
python# distance to A distpt(X,A), distpt(Y,A) (5.024459596047045, 5.093303651460247)
pythondef power(P,Center,r): P=np.array(P);Center=np.array(Center) return np.dot(P-Center,P-Center)-r*r for P,name in [(X,'X'),(Y,'Y')]: print(name, power(P,I,r), power(P,Ia,ra))
pythondistpt(I,Ia), r+ra, ra-r (7.211102550927981, 6.9282032302755105, 3.60555127546399)
pythona=float(sp.sqrt(39)); b=7;c=5 BH=a*c/(b+c); BD=(a-b+c)/2; BE=(a+b-c)/2 BH,BD,BE,(BD+BE)/2 (2.6020824993326657, 2.122498999199199, 4.122498999199199, 3.122498999199199)
python# compute AH AH = b*c*math.sqrt(3)/(b+c) # angle bisector length formula? Actually maybe yes from area; let's check. AH 5.0518148554092255
pythona=math.sqrt(39); b=7;c=5 BH=a*c/(b+c) HX=BH-c/2 HY=(a-b/2)-BH HI = math.sqrt((BH-BD)*(BE-BH)) if True else None # actually power at H to incircle gives HI^2-r^2 = HD^2. BD=(a-b+c)/2 HI=math.sqrt((BH-BD)**2 + ( (b+c-a)/(2*math.sqrt(3)) )**2 ) HX,HY,HI (0.10208249933266567, 0.14291549906573264, 1.7291629005977054)
python# compute O on AI with OI=a/(2sqrt3) OI=a/(2*math.sqrt(3)) # need direction along AI from I to A? Distance AI maybe? formula angle bisector length: AI=math.sqrt(b*c*(1-a*a/(b+c)**2)) AI 5.0518148554092255
python# compute H coordinates from sympy.geometry import Line H = Line(A, I).intersection(Line(B,C))[0] H.evalf() Point2D(4.37500000000000, 2.52590742770461)
pythonimport numpy as np, math def angle(u,v): return math.degrees(math.acos(np.dot(u,v)/(np.linalg.norm(u)*np.linalg.norm(v)))) print(angle(X-O_num, I-O_num), angle(Y-O_num, I-O_num), angle(X-O_num, Ia-O_num))
pythonimport sympy as sp a=sp.sqrt(39); b=sp.Integer(7); c=sp.Integer(5) expr = c/2 + a - b/2 - 2*a*c/(b+c) sp.simplify(expr) -1 + sqrt(39)/6
pythondistpt(O_num,B), c/2, distpt(O_num,C), b/2 (2.623452496692555, 5/2, 3.6231893410089406, 7/2)
python# compute some angles A_np=np.array(A, dtype=float); B_np=np.array(B, dtype=float); C_np=np.array(C, dtype=float) def ang(P,Q,R): P=np.array(P);Q=np.array(Q);R=np.array(R) return angle(P-Q,R-Q) print("AOX",ang(A,O_num,X), "BOX", ang(B,O_num,X), "COY", ang(C,O_num,Y))
pythonimport math, numpy as np I=np.array([2.87750100080080,1.66132597740576]) np.linalg.norm(I) np.float64(3.3226519548115188)
pythona,b,c=sp.symbols('a b c', positive=True) mx=sp.symbols('mx') expr = (b**2*(c/2) + c**2*(a-c/2))/a - (c/2)*(a-c/2) sp.expand(expr) -a*c/2 + 5*c**2/4 + b**2*c/(2*a) - c**3/(2*a)
pythonexpr2 = sp.expand(expr.subs(b**2,a**2-c**2+b*c)) sp.factor(expr2) c**2*(5*a + 2*b - 4*c)/(4*a)
pythonprint(ang(X,O_num,Y))
python# equilateral apexes on XY Xv=np.array(X);Yv=np.array(Y) m=(Xv+Yv)/2 vec=Yv-Xv # rotate vec/2 by +/- 90*? apex = m +/- sqrt(3)/2 * perp? Actually equilateral on segment XY perp=np.array([-(vec[1]), vec[0]]) perp=perp/np.linalg.norm(perp) Z1=m + math.sqrt(3)/2*np.linalg.norm(vec)*perp Z2=m - math.sqrt(3)/2*np.linalg.norm(vec)*perp Z1,Z2, I, O_num (array([4.16413296, 2.49476358]), array([4.57605927, 2.59668891]), array([2.877501 , 1.66132598]), array([4.4387505, 2.5627138]))
pythonprint(ang(X,A,Y))
pythonfor P,name in [(I,'I'),(Ia,'Ia'),(A,'A')]: print(name, ang(X,P,Y))
pythonimport numpy as np, math def rot(P,deg): th=math.radians(deg) R=np.array([[math.cos(th), -math.sin(th)], [math.sin(th), math.cos(th)]]) return R.dot(np.array(P)) for deg in [60,-60]: print("rot X",deg, rot(X,deg)) print("rot Y",deg, rot(Y,deg))
pythona=float(sp.sqrt(39)); b=7;c=5 XD=(b-a)/2 YD=(a-c)/2 XE=(2*c-a-b)/2 YE=(a-2*b+c)/2 XD*YD, XE*YE (0.2349939951951946, 2.2349939951951945)
python# angle between OX and BC direction BC_dir=C_np-B_np print(angle(O_num-X, BC_dir), angle(O_num-Y, -BC_dir))
python# test cyclic ABOX def circle_from3(P,Q,R): return sp.Circle(sp.Point(*P), sp.Point(*Q), sp.Point(*R)) circ = circle_from3(A,B,O_num) float(circ.distance(sp.Point(*X)))
python# use determinant maybe import numpy as np, math A_np=np.array(A,float); B_np=np.array(B,float) def is_cyclic(P,Q,R,S): # compute oriented angles return ang(P,Q,R)+ang(P,S,R) print(ang(A,B,O_num)+ang(A,X,O_num), ang(A,O_num,B)+ang(A,X,B))
pythonprint("∠BAO",ang(B,A,O_num),"∠BXO",ang(B,X,O_num)) print("∠BOA",ang(B,O_num,A),"∠BXA",ang(B,X,A))
pythonprint("∠OAB",ang(O_num,A,B),"∠OXB",ang(O_num,X,B)) print("∠OAC",ang(O_num,A,C),"∠OYC",ang(O_num,Y,C))
python# check if O on circumcircle ABX and ACY circ1=sp.Circle(sp.Point(*A), sp.Point(*B), sp.Point(*X)) circ2=sp.Circle(sp.Point(*A), sp.Point(*C), sp.Point(*Y)) def power_to_circle(P,circle): center=np.array(circle.center.evalf(), dtype=float) rad=float(circle.radius.evalf()) P=np.array(P, dtype=float) return np.linalg.norm(P-center)**2-rad**2 print(power_to_circle(O_num,circ1), power_to_circle(O_num,circ2)) print(circ1.center.evalf(),circ1.radius.evalf()) print(circ2.center.evalf(),circ2.radius.evalf())
pythonfor expr,name in [((B,O_num,X),'BOX'),((B,A,Y),'BAY'),((C,O_num,Y),'COY'),((C,A,X),'CAX'),((X,O_num,A),'XOA'),((B,C,A),'BCA')]: P,Q,R=expr print(name, ang(P,Q,R))
pythonprint("XOA",ang(X,O_num,A),"C", ang(B,C,A)) print("AOY",ang(A,O_num,Y),"B", ang(A,B,C))
python# foot N from O to BC Bpt=np.array(B,float); Cpt=np.array(C,float); Opt=O_num v=Cpt-Bpt t=np.dot(Opt-Bpt,v)/np.dot(v,v) N=Bpt+t*v BN=t*np.linalg.norm(v); CN=(1-t)*np.linalg.norm(v) BN, CN, (c/2 + (a-b/2))/2, N (np.float64(2.6224989991991987), np.float64(3.622498999199199), 2.622498999199199, array([4.37009612, 2.54572624]))
python# angle between AI and BC AIvec=I-A_np BCvec=C_np-B_np print(angle(AIvec,BCvec))
pythona,b,c=sp.symbols('a b c', positive=True) expr = sp.sqrt(3)*b*c/(b+c) - (b+c-a)/sp.sqrt(3) # use a^2 relation maybe factor expr_sub = sp.together(expr).subs(3*b*c,(a+b+c)*(b+c-a)) sp.factor(sp.simplify(expr_sub)) -sqrt(3)*a*(a - b - c)/(3*(b + c))
pythona,b,c=sp.symbols('a b c', positive=True) BH = a*c/(b+c) HN = (b-c)*(b+c-2*a)/(4*(b+c)) expr = sp.simplify(BH + HN - (2*a + c - b)/4) sp.factor(expr) -(b - c)*(2*a - b - c)/(2*(b + c))
pythona,b,c=sp.symbols('a b c', positive=True) BN_expr = a*c/(b+c) + (2*a-b-c)*(b-c)/(4*(b+c)) sp.factor(sp.simplify(BN_expr - (2*a + c - b)/4)) 0
python# angle BHA H=np.array([4.375,2.52590742770461]) print(ang(B_np,H,A_np), ang(A_np,H,Cpt))
Обозначим
Тогда по условию
а из по теореме косинусов
Без ограничения общности будем считать (иначе просто поменяем местами и , а вместе с ними и ).
Пусть — вписанная окружность, — вневписанная окружность, касающаяся стороны , а их центры — и .
Площадь треугольника:
Полупериметр:
Тогда радиусы равны
Но
поэтому
Так как и лежат на биссектрисе , имеем
Возьмём на луче точку так, что
Положим
Заметим, что , потому что
Теперь
Кроме того,
значит
Тогда
Следовательно, окружность с центром и радиусом касается и , и .
Осталось доказать, что она проходит через и .
Пусть
По теореме о биссектрисе
Длина биссектрисы:
А потому
Значит
Обозначим
В треугольнике по теореме синусов:
то есть
Тогда
поскольку .
Из прямоугольного треугольника :
И
Поэтому
Так как
получаем
Значит,
то есть — середина .
Кроме того,
Теперь в прямоугольном треугольнике :
Следовательно,
Точно так же
Итак, точки и лежат на окружности .
Построенная окружность
Что и требовалось доказать.
Если хочешь, я могу ещё написать более короткое “олимпиадное” решение на 10–12 строк без промежуточных вычислений.