Gosub wod 'ввод данных
? «точки пересечения:»
np = 0 'число пересечении
for k = 1 to nt - 1
xl = x(k): yl = y(k)
x2 = x(k + I): y2 = y(k + 1)
for 1 = k + 1 to nt - 1
x3 = x(I): y3 = y(I)
х4 = x(I + 1): y4 = y(I + 1)
Gosub pint 'пересечение
Next 1
Next k
if np = 0 then? «отсутствуют»
End
pint: ¢ точка пересечения:
d213 = (у2 - yl)*(x3 - х1) - (х2 - х1)*(у3 - у1)
d214 = (у2 - у1)*(х4 - х1) - (х2 - х1)*(у4 - у1)
d431 = (у4 - у3)*(х1 - хЗ) - (х4 - х3)*(у1 - уЗ)
d432 = (у4 - у3)*(х2 - хЗ) - (х4 - х3)*(у2 - уЗ)
if d213*d2l4 > 0 or d431*d432 > 0 then
' нет пересечения
elseifd213*d214 < 0 or d431*d432 < 0 then
Gosub tchki ' расчет точки
Else ' отрезки на одной прямой
Gosub lin 1
End if
Return
Tchki: ' расчет точки пересечения
np = np+1
? «отрезок:»; k; k + 1
? «отрезок:»; I; I + 1
D = (у2 - yl)*(x4 - хЗ) - (х2 - х1)*(у4 - уЗ)
Dx = [(у2 - у1)*х1 - (х2 - х1)*у1]*(х4 - хЗ)
Dx = Dx - (х2 - х1)*[(у4 - у3)*х3 - (х4 - х3)*у3]
Dy = (у2 - у1)*[(у4 - у3)*х3 - (х4 - х3)*у3]
Dy = Dy - [(у2 - yl)*xl - (х2 - х1)*у1]*(у4 - уЗ)
х = Dx/D
у = Dy/D
? х; у
Return
Lin 1: 'отрезки на одной прямой
d2 = (х2 - х1)*(х2 - х1) + (у2 - у1)*(у2 - 1)
d3 = (хЗ - х1)*(х2 - х1) + (уЗ - у1)*(у2 - 1)
d4 = (х4 - xl)*(x2 - х1) + (у4 - у1)*(у2 - 1)
if d3 > d2 and d4 > d2 then
' нет пересечения
Iseif d3 < 0 and d4 < 0 then
' нет пересечения
else ' отрезки пересекаются:
Gosub otrеz ' общий отрезок
End if
Return
Otrez: 'расчет общего отрезка
np = np + 1
? «отрезок пересечения:»
if d3 < 0 or d4 < 0 then
? х1; у1; «-»
elseif d3 < d4 then
? х3; у3; «-»
Else
? х4; у4; «-»
End if
if d2 < d3 or d2 < d4 then
? х2; у2
elseif d3 < d4 then
? x3; y3
Else
? х4; у4
End if
Return
Vvod: ' ввод данных
Restore test1
Read n
? «точек:»;nt
for k = 1 to nt
Read x(k), y(k)
? x(k); y(k)
Next kn
t = nt + 1
x(nt) = x(l)
y(nt) = y(l)
Return
test1: 'точки ломаной:
Data 4
Data 0, 0
Data 1, 0
Data 0, 1
Data 1, 1
test2: 'точки ломаной:
Data 4
Data 0, 0
Data 1, 0
Data 0, 1
Data 1, 1
В тексте данной программы записаны два варианта тестовых данных, смена которых может быть проведена изменением имени метки test1 или test2 в операторе перезагрузки restore в подпрограмме ввода данных.