Четырехугольник и три отрезка

Очень сложная задача по аналитической геометрии. Нужно было найти площади всех фигур, полученных после проведения трех отрезков, как показано на рисунке.
Совершенно ясно, что основная трудность - определение координат точек пересечений L и M. Я оказался единственным, кто в общем виде получил четыре формулы. За них мне Марк Иванович Сканави поставил пять с плюсом. Найти же площади фигур - дело уже школьное: ведь все координаты вершин известны. Для вычисления площади простого многоугольника с любым количеством вершин, представленных в виде списка координат, при последовательном обходе которых, не образуются пересекающиеся линии, применяется формула Гаусса, иначе называемая "формулой землемера", "формулой геодезиста", "формулой шнурования", "алгоритмом шнурования", а так же "методом треугольников".

Конечно, формулы для L и M можно эффективно упростить, но решил оставить так, как оказалось в найденных черновиках. Причем черновиком служили поля газеты "Правда". Вот ведь какой дефицит бумаги был в конце шестидесятых прошлого столетия!

Сегодня (это спустя аж 52 года!) я составил программу на Yabasic, чтобы лишний раз убедиться в верности результатов:

rem КООРДИНАТЫ ТОЧЕК L и М в четырехугольнике
rem и ПЛОЩАДИ ВСЕХ ФИГУР
open #1,"LM.txt","w"
xA=0:yA=0:xB=-2:yB=7:xC=9:yC=8:xD=7:yD=0
A=2*(yB*xC-yC*xB)+xD*(2*yC-yB)
xL=1/2*(xB-(yB*xD*(xB-2*xC))/A)
yL=yB*(xD*(2*yC-yB)+yB*xC-yC*xB)/A
xM=xD*(yC*(xB-xD)-yB*(2*xC-xD))/(2*yC*(xB-xD)-yB*(2*xC-xD))
yM=yB*yC*xD/A
print #1," A ( ";:print #1,xA;:print #1," , ";:print #1,yA;:print #1," )"
print #1," B ( ";:print #1,xB;:print #1," , ";:print #1,yB;:print #1," )"
print #1," C ( ";:print #1,xC;:print #1," , ";:print #1,yC;:print #1," )"
print #1," D ( ";:print #1,xD;:print #1," , ";:print #1,yD;:print #1," )"
print #1," L ( ";:print #1,xL;:print #1," , ";:print #1,yL;:print #1," )"
print #1," M ( ";:print #1,xM;:print #1," , ";:print #1,yM;:print #1," )"
s1=1/2*(xA*yD/2+xD/2*yM+xM*yL+xL*yB/2+xB/2*yA)
s1=s1-1/2*(yA*xD/2+yD/2*xM+yM*xL+yL*xB/2+yB/2*xA)
x1=xD/2:y1=yD/2:x2=xD:y2=yD:x3=xM:y3=yM
s2=1/2*(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
x1=xD:y1=yD:x2=xC:y2=yC:x3=xM:y3=yM
s3=1/2*(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
x1=xM:y1=yM:x2=xC:y2=yC:x3=xL:y3=yL
s4=1/2*(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
x1=xL:y1=yL:x2=xC:y2=yC:x3=xB:y3=yB
s5=1/2*(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
x1=xB/2:y1=yB/2:x2=xL:y2=yL:x3=xB:y3=yB
s6=1/2*(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
s=1/2*(xA*yD+xD*yC+xC*yB+xB*yA-yA*xD-yD*xC-yC*xB-yB*xA)
s0=s1+s2+s3+s4+s5+s6
print #1," S1 = ";:print #1,s1
print #1," S2 = ";:print #1,s2
print #1," S3 = ";:print #1,s3
print #1," S4 = ";:print #1,s4
print #1," S5 = ";:print #1,s5
print #1," S6 = ";:print #1,s6
print #1," SUM S = ";:print #1,s0
print #1," S(ABCD) = ";:print #1,s

Для этого конкретного примера получил:

 A ( 0 , 0 )
 B ( -2 , 7 )
 C ( 9 , 8 )
 D ( 7 , 0 )
 L ( 1.21719 , 4.49774 )
 M ( 4.71946 , 1.77376 )
S1 = 23.4323
 S2 = 4.72018
 S3 = 5.77982
 S4 = 6.19266
 S5 = 10.5275
 S6 = 8.59748
 SUM S = 59.25
 S(ABCD) = 59.25

Сумма площадей шести фигур SUM S оказалась равной площади исходного четырехугольника S(ABCD). Это важный контроль.

Построил только что на миллиметровке такой четырехугольник, провел нужные отрезки и сравнил результаты. Идеальное совпадение с координатами и площадями!

PS. Программа составлена именно для случая, показанного на рисунке. То есть вершина А совпадает с началом декартовых координат, причем сторона AD лежит на оси абсцисс. Если бы случай был самый общий, то формулы получились бы на порядок запутанней.

29 июля 2021 г.


Рецензии