БДПУ
Замкнута ламана без самоперетинів
Зміст
Введення
Глава 1
§ 1. Поняття ламаної
§ 2. Пряма на площині
Глава 2
Вступ: Перелік основних процедур та функцій, які у програмах
§ 1. Function Peres, Блок Схема
п .2 Function Peres, на мовою Turbo Pascal
§ 2. Рекурсивний спосіб побудови простої замкнутої ламаної
§ 3. Верхня оцінка кількості способів побудови ПЗЛ
§ 4. Побудови простої замкнутої ламаної методом "Трикутника"
п.1 Ідея методу
п.2 Реалізація на мові Паскаль
Список літератури
Введення
Тема бакалаврської роботи є "Проста замкнена ламана крива" (ПЗЛ).
Актуальність: обраної теми полягає в тому, що теорія ПЗЛ має практичне застосування наприклад: прокладання газопроводу, залізничних шляхів і т.д., але теорія ПЗЛ не дає відповіді як і скількома способами це можливо зробити. У теорії ПЗЛ дано лише визначення ПЗЛ та її компонентів без виділення, яких або властивостей. А так рішення проблеми обраної теми є, приватним випадком рішення задачі комівояжера її ще називають транспортної завданням.
Об'єкт дослідження: Планіметрія.
Предмет дослідження: Проста замкнена ламана на площині.
Цілі: Вивчить поняття ПЗЛ, виділити його властивості і скласти алгоритм побудови.
Завдання:
Скласти рекурсивний алгоритм дозволяє побудувати всі можливі ПЗЛ через n довільних точок площини (зауваження ці точки повинні бути вершинами ПЗЛ, та інших вершин немає). Реалізувати його в середовищі Turbo Pascal.
Дати верхню оцінку кількості способів побудови ПЗЛ через n довільних точок площини.
Скласти не рекурсивний алгоритм і реалізувати його на мові Turbo Pascal, що дозволяє будувати ПЗЛ для великої кількості довільних точок
Гіпотези:
ПЗЛ можна побудувати завжди, крім випадку коли всі точки лежать на одній прямій.
Хай через n точок проходять S прямих мають не менше 4-х даних точок, тоді через ці n точок можна провести не більше ніж
різних ПЗЛ, де k i -Кількість точок належать i-ої прямий, i = 1,2 ... S
Глава 1
§ 1. Поняття ламаної
Фігура, утворена кінцевим набором відрізків, розташованих так, що кінець першого є початком другого, кінець другого - початком третього і т.д., називається ламаною лінією або просто ламаної (рис. 1). Відрізки називаються сторонами ламаної, а їх кінці - вершинами ламаною.
Ламана позначається послідовним зазначенням її вершин. Наприклад, ламана АВС DE, ламана A 1 A 2 ... A n.
Ламана називається простою, якщо вона не має точок самоперетинання (рис. 2).
Ламана називається замкнутою, якщо початок першого відрізка ламаної збігається з кінцем останнього. Замкнуту ламану, у якої точками самоперетинання є тільки початкова та кінцева точки, також називають простий (рис. 3).
Довжиною ламаної називається сума довжин її сторін.
§ 2. Пряма на площині.
п.1. Рівняння прямої на площині.
З курсу геометрії відомо, що будь-яка пряма на площині xOy має рівняння (1) [2], де - Постійні.
Нехай дано дві довільні точки і прямий l, тоді знайдемо рівняння прямої l, що проходить через ці точки.
Скористаємося рівнянням (1).
Розглянемо два випадки, коли 1) і 2) .
Якщо то, рівняння (1) набуде вигляду , тобто пряма буде паралельна осі Оу або збігатися з нею.
Зауваження: тому що коефіцієнти а і з задані не однозначно, тому в алгоритмах, що використовують рівняння прямої використовується тільки геометрична інтерпретація цього випадку, тобто той факт якщо пряма проходить через дві точки у яких перші координати рівні, то ця пряма паралельна осі О y.
Якщо тоді рівняння (1) можна представити у вигляді (2), де . Так як точки і лежать на прямій l, то їх координати є корінням рівняння (2). Тому для знаходження коефіцієнтів рівняння (2) досить вирішити систему рівнянь
í
щодо цих змінних k і d, отримаємо рішення,
í тобто ми знайшли рівняння прямої l.
Таким чином, якщо пряма не паралельна осі Оу то рівняння (1) рівносильне рівнянню інакше рівняння (1) рівносильне рівнянню .
п.2 Взаємне розташування двох прямих на площині.
Ще зі шкільного курсу геометрії основної школи відомо, що дві прямі на площині або перетинаються, або паралельні.
Нехай дві прямі l: , І g: тоді якщо ці прямі паралельні, то [2] інакше .
Якщо дві різні прямі l і g не паралельні, то вони мають спільну точку. Координати цієї точки є рішенням системи рівнянь.
í Þ í Þ í
Глава 2
Вступ: Перелік основних процедур та функцій, які у програмах
Function S_3 (T, B, C: tochka): Boolean;
Функція істина якщо три точки лежать на одній прямій.
Ідея: знаходимо рівняння прямої l, що проходить через точки В і С, і перевіряємо на приналежність точки Т прямий l.
Var k1, b1: real;
Begin
If ((Bx = Cx) and (Bx = Tx)) or
((By = Cy) and (By = Ty)) then S_3: = true
else
if Bx = Cx then S_3: = false
else begin
k1: = (By-Cy) / (Bx-Cx);
b1: = By-k1 * Bx;
if round (Ty) = round (k1 * T.x + b1) then S_3: = true
else S_3: = false;
end
End;
Function Prin (T, B, C: tochka): boolean;
Функція істина якщо точка Т належить відрізку НД
Ідея: Якщо точка Т лежить на відрізку ВС, то вона лежить на прямій проходить через точки В і С, і укладена між ними.
Begin
If S_3 (T, B, C) then
if (((Bx <= Tx) and (Tx <= Cx)) or ((Cx <= Tx) and (Tx <= Bx))) and
(((By <= Ty) and (Ty <= Cy)) or ((Cy <= Ty) and (Ty <= By)))
then Prin: = true
else Prin: = false
else Prin: = false
End;
Function Peres, Блок Схема
Істина якщо відрізки [AB] і [CD] мають спільні точки за винятком випадків:
1) якщо відрізки збігаються;
2) якщо один кінець відрізка збігається з одним з кінців іншого відрізка, та інших спільних точок немає.
п .2 Function Peres, на мовою Turbo Pascal
Function Peres (A, B, C, D: tochka): boolean;
Var O: tochka;
k1, k2, b1, b2: real;
s1, s2: Boolean;
Begin
{Перевірка 1 - го випадку}
if (Ax = Cx) and (Ay = Cy) and (Bx = Dx) and (By = Dy) then Peres: = False
else
if (Ax = Dx) and (Ay = Dy) and (Bx = Cx) and (By = Cy) then Peres: = False
else
{Перевірка 2 - го випадку}
If (Ax = Cx) and (Ay = Cy) then if Prin (D, A, B) or Prin (B, C, D) then Peres: = true else Peres: = False
else
If (Ax = Dx) and (Ay = Dy) then if Prin (C, A, B) or Prin (B, C, D) then Peres: = true else Peres: = False
else
If (Bx = Cx) and (By = Cy) then if Prin (D, A, B) or Prin (A, C, D) then Peres: = true else Peres: = False
else
If (Bx = Dx) and (By = Dy) then if Prin (C, A, B) or Prin (A, C, D) then Peres: = true else Peres: = False
else {загальної випадок}
If Ax = Bx then begin if Cx = Dx then if Prin (A, C, D) or
Prin (B, C, D) or
Prin (C, A, B) or
Prin (D, A, B) then Peres: = true else Peres: = false
else begin
k2: = (Cy-Dy) / (Cx-Dx);
b2: = Cy-k2 * Cx;
Ox: = Ax;
Oy: = k2 * O.x + b2;
if Prin (O, C, D) and Prin (O, A, B) then Peres: = true
else Peres: = False
end end
else if Cx = Dx then begin
k1: = (Ay-By) / (Ax-Bx);
b1: = Ay-k1 * Ax;
Ox: = Cx;
Oy: = k1 * O.x + b1;
if Prin (O, C, D) and Prin (O, A, B) then Peres: = true
else Peres: = False
end
else begin
k1: = (Ay-By) / (Ax-Bx);
k2: = (Cy-Dy) / (Cx-Dx);
if k1 = k2 then {} if Prin (A, C, D) or
Prin (B, C, D) or
Prin (C, A, B) or
Prin (D, A, B) then Peres: = true
else Peres: = false
else begin
b1: = Ay-k1 * Ax;
b2: = Cy-k2 * Cx;
Ox: = (b1-b2) / (k2-k1);
if k1 = 0 then Oy: = b1
else if k2 = 0 then Oy: = b2
else Oy: = (b1/k1-b2/k2) / (1/k1-1/k2);
if Prin (O, C, D) and Prin (O, A, B)
then Peres: = true
else Peres: = false
end
end
End;
Рекурсивний спосіб побудови простої замкнутої ламаної
Ідея: Щоб перебрати всі можливі способи побудови простої замкнутої прямий ми скористалися наступним алгоритмом побудови:
Зафіксували одну з n точок, тому що не має значення, яка точка буде початковій т.к ламана замкнена;
Поєднуючи зафіксовану точку з одного з незайнятих точок, отримуємо першу сторону ламаною.
Потім з'єднання продовжуємо рекурсивно повним перебором всіх незайнятих точок, за умов:
Нову точку можна з'єднати з останньої приєднаної точкою, якщо відрізок, що з'єднує ці точки, не перетинає жодну з уже побудованих сторін ламаної;
Продовжуємо побудова до тих пір, поки є незадіяні точки,
Якщо вільних крапок немає і відрізок, що з'єднує останню приєднану крапку з першою, не перетинає жодну зі сторін побудованої ламаної те, побудована ламана і цей відрізок будуть утворювати шукану замкнуту ламану.
Повертаємося до пункту 2 до тих пір поки не будуть перебрані всі незайняті точки.
Програма
Uses crt;
Const n = 9; {Кількість точок}
m = 400; {}
Type tochka = record
x, y, r: real;
n: word;
end;
Mass = array [0 .. n] of tochka;
Var sch: word;
number: text;
Procedure Sozd_t (Var MT: Mass; n, m: Word);
Var i: word;
Begin randomize;
For i: = 1 to n do
begin
MT [i]. X: = random (m);
MT [i]. Y: = random (m);
MT [i]. N: = i;
end;
End;
Procedure Sdvyg (Var MT: Mass; n1, n2: word); {n1-n2-}
Var i: word;
Begin
For i: = n1 to n2-1 do MT [i]: = MT [i +1];
MT [n2]. X: = 1000; MT [n2]. Y: = 1000;
End;
{Зберігаємо отриману ламану}
Procedure Save (MT: mass);
Var i: word;
st1, st2: string [n];
Begin
sch: = sch +1; st2 :='';
For i: = 1 to n do
begin
Write (MT [i]. N, '');
str (MT [i]. n, st1);
st2: = st2 + st1;
end;
Writeln ('---', sch ,'---');
Writeln (number, st2);
readkey;
End;
Procedure Rekurs (MT: Mass; Kol: word; T: word);
Var i, j, g: word;
s: boolean;
Begin
MT [0]: = MT [t];
Sdvyg (MT, t, kol);
MT [kol]: = MT [0];
Kol: = kol-1;
IF kol> 0 then
For j: = 1 to kol do
begin s: = true;
for i: = kol +1 to n-1 do
if Peres (MT [j], MT [kol +1], MT [i], MT [i +1]) then s: = false;
if s then Rekurs (MT, kol, j)
end
ELSE begin s: = true;
For g: = 1 to n-1 do
if Peres (MT [1], MT [n], MT [g], MT [g +1]) then s: = false;
if s then Save (MT);
end;
End;
Procedure Recurs_Soed (MT: Mass);
Var v: word;
Begin
For v: = 1 to n-1 do Rekurs (MT, n-1, v)
End;
Procedure Proseivanie (var f1, f2: text);
Var st1, st2, st3: string [n];
S: boolean;
i, j, v: byte;
Begin v: = 1;
Read (f1, st1);
Writeln (f2, st1);
While not eof (f1) do
begin
Readln (f1, st1);
reset (f2); {ГБВ ў "ЕўҐ ¬ Єгаб ® Є ў з "® д ©"}
s: = true;
st3 [n]: = st1 [n];
for i: = 1 to n-1 do st3 [i]: = st1 [ni];
{Џа ® ўҐаЄ б ® ўЇ ¤ Г ЕҐ st1 б р | Г § ЇЕб л ¬ Е ў f2}
While not eof (f2) and s do
begin
Readln (f2, st2);
j: = 0;
For i: = 1 to n do
if (st2 [i] = st1 [i]) or (st2 [i] = st3 [i]) then j: = j +1;
if j = n then s: = false;
end;
if s then begin Append (f2); Writeln (f2, st1); v: = v +1 end;
end;
writeln;
writeln ('---', v ,'---');
End;
Var MT: mass;
k, ch: word;
Loman: text;
BEGIN
clrscr;
sch: = 0;
Sozd_T (MT, n, m);
assign (number, 'number.txt');
Rewrite (number);
Recurs_Soed (MT);
readln;
Close (number);
Reset (number);
assign (Loman, 'Loman.txt');
Rewrite (Loman);
Proseivanie (Number, Loman);
Close (Number);
Close (Loman);
readln;
END.
Верхня оцінка кількості способів побудови ПЗЛ
Гіпотеза: Хай через n довільних точок площини проходить S прямих містять не менш ніж по 4-ри точки з даних, тоді через ці n точок можливо провести простих замкнутих ламаних не більше ніж де k i - Кількість точок з даних точок лежать на i прямої, .
Доказ:
Ι Етап.
Кількість способів побудови ламаних .
Кількість способів побудови замкнутих ламаних тому що не має значення яка вершина буде початковою.
Очевидно, що кількість ПЗЛ буде не більше кількості замкнутих ламаних. Нехай L - кількість способів побудови ПЗЛ через n точок, тоді .
ΙΙ Етап.
Дано k i - Кількість точок лежать на i прямий, де .
Нехай на якомусь кроці побудови ПЗЛ ми прийшли в Т.А.
Розглянемо малюнок.
Нехай т.А Î i-ої прямий з k i - крапками з даних. Розглянемо випадки з'єднання точки А з крапками на i прямій.
Крапку А можна з'єднати максимум з двома точками, що лежать на цій прямій, щоб виконувалися умови побудови. Кількість же всіляких випадків з'єднання точки А з іншими точками прямої дорівнює (k i -1). Порахуємо найменшу кількість випадків, які не задовольняють умовам побудови.
При кожному j зверненні до точок цієї прямої будуть не задовольняти випадків.
Але тому таких прямих S отримуємо
випадків побудови ламаних задовольняють умови побудови.
Якщо не має значення напрямок обходу ламаної то, у результаті отримуємо кількість способів побудови ПЗЛ буде
Побудови простої замкнутої ламаної методом "Трикутника"
п.1 Ідея методу
Ідея: Нехай дано n довільних точок на площині.
Вибираємо будь-яку з них, назвемо "першої". Потім беремо дві найближчі до неї точки. На цих трьох обраних точках будуємо трикутник.
Беремо наступну найближчу, не зайняту точку до "першої".
Шукаємо найближчий відрізок
п.2 Реалізація на мові Паскаль
uses crt, graph;
Const n = 10; {Задаємо кількість точок}
m = 400; {Довжина сторони квадрата на якому розташовані точки}
Type
tochka = record
x, y, r: real;
end;
Mass = array [0 .. n] of tochka;
Var sch: word; {Лічильник точок}
{Визначає довільним чином n точок у квадраті зі стороною m}
Procedure Sozd_t (Var A: Mass; n, m: Word);
Var i: word;
Begin randomize;
For i: = 1 to n do
begin
A [i]. X: = random (m);
A [i]. Y: = random (m);
end;
End;
{Малює відрізок ВС}
Procedure Lin (B, C: tochka);
Begin
Line (Round (Bx), Round (By), Round (Cx), Round (Cy))
End;
{Визначає відстань між точками}
Function R_TT (Var A, B: tochka): real;
Begin R_TT: = Sqrt (sqr (Ax-Bx) + sqr (Ay-By));
End;
{Визначає відстань між i-ої точкою та іншими}
Procedure Rasst_TT (Var A: Mass; i, n: word);
Var j: word;
Begin
For j: = 1 to n do
A [j]. R: = R_TT (A [i], A [j])
End;
{Усуває негативні значення відстані}
Procedure absal (Var A: Mass; n1, n2: word);
Var i: word;
Begin
For i: = n1 to n2 do A [i]. R: = abs (A [i]. R)
End;
{Шукає номер найближчої точки до i-ої}
Function PoiskNT (Var A: Mass; n1, n2: word): word;
var i, j: word;
Begin j: = n1;
While A [j]. R <0 do j: = j +1;
For i: = n1 to n2 do
if (A [i]. r> 0) and (A [i]. r <A [j]. r) then j: = i;
PoiskNT: = j;
End;
{Зсуває точки в масиві на 1 позицію вліво починаючи з n 1 до n 2}
Procedure Sdvyg (Var A: Mass; n1, n2: word);
Var i: word;
Begin
For i: = n1 to n2-1 do A [i]: = A [i +1];
A [n 2]. X: = 1000; A [n 2]. Y: = 1000;
End;
{Шукає підставу перпендикуляра опущеного з точки Т на пряму проходить через точки В ІС}
Procedure Osn (T, B, C: tochka; var O: tochka);
Var k, b2, a1, b1, c1: real;
Begin
If (Bx = Cx) then begin Ox: = Bx; Oy: = Ty end
else begin
k: = (By-Cy) / (Bx-Cx);
b2: = By-k * Bx;
a1: = 2 * (Bx-Cx) +2 * k * (By-Cy);
b1: = 2 * b2 * (By-Cy) + (sqr (Cx)-sqr (Bx)) + (sqr (Cy)-sqr (By));
c1: = sqr (Bx-Tx) + sqr (By-Ty)-sqr (Cx-Tx)-sqr (Cy-Ty);
Ox: = (-c1-b1) / a1;
Oy: = k * O.x + b2;
end;
End;
{Функція істина якщо три точки лежать на одній прямій}
FUNCTION S_3 (T, B, C: tochka): Boolean;
{Функція істина якщо точка Т належить відрізку НД}
Function Prin (T, B, C: tochka): boolean;
Begin
If S_3 (T, B, C) then
if (((Bx <= Tx) and (Tx <= Cx)) or ((Cx <= Tx) and (Tx <= Bx))) and
(((By <= Ty) and (Ty <= Cy)) or ((Cy <= Ty) and (Ty <= By)))
then Prin: = true
else Prin: = false
else Prin: = false
End;
{Повертає відстань між точкою і відрізком НД}
Function R_TO (T, B, C: tochka): real;
Var T1: tochka;
Begin
Osn (T, B, C, T1);
If prin (T1, B, C) then R_TO: = R_tt (T1, T)
else if R_tt (T, B) <= R_tt (T, C) then R_TO: = R_tt (T, B)
else R_TO: = R_tt (T, C)
End;
{Будує ломанную через точки з номера n 1 до n 2}
Procedure Postr (A: Mass; n1, n2: word);
Var i: word;
Begin
for i: = n1 to n2 do begin PieSlice (Round (A [i]. x), Round (A [i]. y), 0, 360, 2);
if i = n2 then
Line (Round (A [n2]. X), Round (A [n2]. Y), Round (A [n1]. X), Round (A [n1]. Y))
else Line (Round (A [i]. x), Round (A [i]. y), Round (A [i +1]. x), Round (A [i +1]. y))
end;
End;
{Видає інформацію про кількість задіяних точок}
Procedure Schet;
Var st: string;
code: integer;
Begin sch: = sch +1;
str (sch, st);
OuttextXY (600,100, st)
End;
{Істина якщо відрізки [AB] і [CD] мають спільні точки за винятком випадків 1) якщо відрізки збігаються;
2) якщо один кінець відрізка збігається з одним з кінців іншого відрізка та інших спільних точок немає.}
Function Peres (A, B, C, D: tochka): boolean;
Var A: mass;
B, C: tochka;
Danger, s1, s2, s3, s4: boolean;
T, OL, O, OK, OKP, i, j, t1, t2, o1, o2: word;
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
st: string;
BEGIN
sch: = 0;
grDriver: = Detect;
InitGraph (grDriver, grMode,'');
ErrCode: = GraphResult;
clrScr;
Sozd_t (A, n, m); {‡ ¤ Г ¬ Їа ® Е § ў ® "м ® в ® зЄЕ}
Rasst_TT (A, n);
{'®§¤ Г ¬ ЇҐаўл © ваҐгЈ ® "м ЕЄ}
A [0]: = A [1];
Sdvyg (A, 1, n);
A [n]: = A [0];
i: = PoiskNT (A, 1, n-1);
A [0]: = A [i]; {€ йҐ ¬ Ў "Е | Йео в ® зЄг Є T}
Sdvyg (A, i, n-1);
Sdvyg (A, n-1, n);
A [n]: = A [0];
i: = Poisknt (A, 1, n-2); {€ йҐ ¬ 2 - про Ў "Є | Йоо в ® зЄг Є T}
{Џа ® ўҐаЕ ¬ "Г | у" Е ® ¤ ® © Їап ¬ ® ©}
While S_3 (A [i], A [n-1], A [n]) do {!!!!}
begin A [i]. r: =- A [i]. r; i: = Poisknt (A, 1, n-2) end;
A [0]: = A [i];
Sdvyg (A, i, n-2);
Sdvyg (A, n-2, n);
A [n]: = A [0];
textcolor (1);
t1: = 1; t2: = n-3;
o1: = n-2; o2: = n;
ClearDevice;
Postr (A, o1, o2);
readkey;
sch: = 3;
Repeat
Absal (A, 1, n);
{Ќе ® ¤ Е ¬ Ў "Е | Йео в ® зЄг ў бв. Є ® "мжҐ}
T: = Poisknt (A, t1, t2);
{‡ ЇЕб뢥 ¬ аббв ® п ЕҐ ® в в ® зЄЕ ¤ ® ® вॠ§ Є ў "Ґўл © Є ® Ґж}
For i: = o1 to o2-1 do
A [i]. R: = R_TO (A [T], A [i], A [i +1]);
A [o2]. R: = R_TO (A [T], A [O2], A [O1]);
{€ йҐ ¬ р | л © ® вॠ§ ® Є}
j: = t1-1;
Repeat
{§ ЇгбвЕ ¬ бзҐвзЕЄ Ї ® ўв ® ॠŠ©}
j: = j +1;
{€ йҐ ¬ Ў "Е | Йе © ® вॠ§ ® Є}
O: = O1;
while A [O]. r <0 do O: = O +1;
For i: = O1 to O2 do
if (A [i]. r> 0) and (A [i]. r <A [O]. r) then O: = i;
{[O, O +1] Ў "Е | Йе © ® вॠ§ ® Є}
{ЋЇаҐ ¤ Г "пҐ ¬" ЕзЕҐ Ї "® еее ваҐгЈ ® "м ЕЄ ® ў}
if O = O2 then Ok: = O1 else Ok: = O +1;
Cleardevice;
setcolor (blue);
postr (A, o1, o2);
PieSlice (Round (A [o1]. X), Round (A [o1]. Y), 0, 360, 5);
PieSlice (Round (A [o2]. X), Round (A [o2]. Y), 0, 360, 5);
PieSlice (Round (A [t]. X), Round (A [t]. Y), 0, 360, 3);
setcolor (15);
lin (A [t], A [o]); lin (A [t], A [ok]);
setcolor (4);
lin (A [o], A [ok]);
readkey;
s4: = false;
For i: = o1 to o2-1 do
if Peres (A [T], A [O], A [i], A [i +1]) or
Peres (A [T], A [Ok], A [i], A [i +1]) then begin s4: = true; setcolor (green); lin (A [i], A [i +1]) ;
str (A [i]. x, st); OuttextXY (400,300, st);
str (A [i]. y, st); OuttextXY (400,310, st);
str (A [i +1]. x, st); OuttextXY (400,320, st);
str (A [i +1]. y, st); OuttextXY (400,330, st);
str (A [T]. x, st); OuttextXY (400,340, st);
str (A [T]. y, st); OuttextXY (400,350, st);
str (A [O]. x, st); OuttextXY (400,360, st);
str (A [O]. y, st); OuttextXY (400,370, st);
str (A [Ok]. x, st); OuttextXY (400,380, st);
str (A [Ok]. y, st); OuttextXY (400,390, st);
readkey end;
if Peres (A [T], A [O], A [o2], A [o1]) or
Peres (A [T], A [Ok], A [o2], A [o1]) then begin s4: = true; setcolor (green); lin (A [i], A [i +1]); readkey end;
if s4 then A [O]. r: =- A [O]. r;
until (A [O]. r> 0) {or (j = t2)};
if A [O]. r> 0 then
Begin {ЏҐаҐ ¬ ҐйҐ ¬ в ® зЄг 'ў ® ў ® Г Є ® "мж ®}
ClearDevice;
setcolor (4);
PieSlice (Round (A [o1]. X), Round (A [o1]. Y), 0, 360, 3);
setcolor (1);
Postr (A, o1, o2);
PieSlice (Round (A [t]. X), Round (A [t]. Y), 0, 360, 5);
Lin (A [o], A [ok]);
delay (3000);
A [0]: = A [T];
Sdvyg (A, t, t2);
O1: = t2;
t2: = t2-1;
Sdvyg (A, O1, O); {Ћбў ® Ў ® ¤ Е "Е пзҐ © Єг ¤ "п ® ў ® © в ® зЄЕ}
A [O]: = A [0];
schet;
readkey;
End
else Danger: = true;
Cleardevice;
Postr (A, o1, o2);
Until Danger or (t2 = 0);
Textcolor (4);
Writeln ('ђҐ § г "МВВ аЎ ® вл Їа ® Ја ¬ ¬ л ');
If Danger then begin CloseGraph; Writeln (''® Г ¤ Г ЕВМ в ® зЄЕ Ґў ®§¬®|®'); readln; end
else begin ClearDevice;
Postr (A, o1, o2);
readkey;
Closegraph;
end;
END.
Список літератури
Фаронов Turbo Pascal 7.0.
Погорєлов А.В. Геометрія: Навчальний посібник для вузів. - 2-е вид. - М.: Наука. Головна редакція фізико-математичної літератури, 1984. - 288с.
Дискретна математика для програмістів / Новиков Ф. А. - Спб.: Питер, 2001. - 304 с. : Іл.