Dim x(nt), y(nt)

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 в подпрограмме ввода данных.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: