Проста замкнена ламана крива

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

БДПУ

Замкнута ламана без самоперетинів

Зміст

Введення

Глава 1

§ 1. Поняття ламаної

§ 2. Пряма на площині

Глава 2

Вступ: Перелік основних процедур та функцій, які у програмах

§ 1. Function Peres, Блок Схема

п .2 Function Peres, на мовою Turbo Pascal

§ 2. Рекурсивний спосіб побудови простої замкнутої ламаної

§ 3. Верхня оцінка кількості способів побудови ПЗЛ

§ 4. Побудови простої замкнутої ламаної методом "Трикутника"

п.1 Ідея методу

п.2 Реалізація на мові Паскаль

Список літератури

Введення

Тема бакалаврської роботи є "Проста замкнена ламана крива" (ПЗЛ).

Актуальність: обраної теми полягає в тому, що теорія ПЗЛ має практичне застосування наприклад: прокладання газопроводу, залізничних шляхів і т.д., але теорія ПЗЛ не дає відповіді як і скількома способами це можливо зробити. У теорії ПЗЛ дано лише визначення ПЗЛ та її компонентів без виділення, яких або властивостей. А так рішення проблеми обраної теми є, приватним випадком рішення задачі комівояжера її ще називають транспортної завданням.

Об'єкт дослідження: Планіметрія.

Предмет дослідження: Проста замкнена ламана на площині.

Цілі: Вивчить поняття ПЗЛ, виділити його властивості і скласти алгоритм побудови.

Завдання:

  1. Скласти рекурсивний алгоритм дозволяє побудувати всі можливі ПЗЛ через n довільних точок площини (зауваження ці точки повинні бути вершинами ПЗЛ, та інших вершин немає). Реалізувати його в середовищі Turbo Pascal.

  2. Дати верхню оцінку кількості способів побудови ПЗЛ через n довільних точок площини.

  3. Скласти не рекурсивний алгоритм і реалізувати його на мові Turbo Pascal, що дозволяє будувати ПЗЛ для великої кількості довільних точок

Гіпотези:

  1. ПЗЛ можна побудувати завжди, крім випадку коли всі точки лежать на одній прямій.

  2. Хай через 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. Якщо то, рівняння (1) набуде вигляду , тобто пряма буде паралельна осі Оу або збігатися з нею.

Зауваження: тому що коефіцієнти а і з задані не однозначно, тому в алгоритмах, що використовують рівняння прямої використовується тільки геометрична інтерпретація цього випадку, тобто той факт якщо пряма проходить через дві точки у яких перші координати рівні, то ця пряма паралельна осі О y.

  1. Якщо тоді рівняння (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;

  1. 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;

  1. Рекурсивний спосіб побудови простої замкнутої ламаної

    Ідея: Щоб перебрати всі можливі способи побудови простої замкнутої прямий ми скористалися наступним алгоритмом побудови:

    1. Зафіксували одну з n точок, тому що не має значення, яка точка буде початковій т.к ламана замкнена;

    2. Поєднуючи зафіксовану точку з одного з незайнятих точок, отримуємо першу сторону ламаною.

    3. Потім з'єднання продовжуємо рекурсивно повним перебором всіх незайнятих точок, за умов:

    • Нову точку можна з'єднати з останньої приєднаної точкою, якщо відрізок, що з'єднує ці точки, не перетинає жодну з уже побудованих сторін ламаної;

    • Продовжуємо побудова до тих пір, поки є незадіяні точки,

    • Якщо вільних крапок немає і відрізок, що з'єднує останню приєднану крапку з першою, не перетинає жодну зі сторін побудованої ламаної те, побудована ламана і цей відрізок будуть утворювати шукану замкнуту ламану.

    1. Повертаємося до пункту 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.

    1. Верхня оцінка кількості способів побудови ПЗЛ

    Гіпотеза: Хай через n довільних точок площини проходить S прямих містять не менш ніж по 4-ри точки з даних, тоді через ці n точок можливо провести простих замкнутих ламаних не більше ніж де k i - Кількість точок з даних точок лежать на i прямої, .

    Доказ:

    Ι Етап.

    1. Кількість способів побудови ламаних .

    2. Кількість способів побудови замкнутих ламаних тому що не має значення яка вершина буде початковою.

    3. Очевидно, що кількість ПЗЛ буде не більше кількості замкнутих ламаних. Нехай L - кількість способів побудови ПЗЛ через n точок, тоді .

    ΙΙ Етап.

    Дано k i - Кількість точок лежать на i прямий, де .

    Нехай на якомусь кроці побудови ПЗЛ ми прийшли в Т.А.

    Розглянемо малюнок.

    Нехай т.А Î i-ої прямий з k i - крапками з даних. Розглянемо випадки з'єднання точки А з крапками на i прямій.

    Крапку А можна з'єднати максимум з двома точками, що лежать на цій прямій, щоб виконувалися умови побудови. Кількість же всіляких випадків з'єднання точки А з іншими точками прямої дорівнює (k i -1). Порахуємо найменшу кількість випадків, які не задовольняють умовам побудови.

    При кожному j зверненні до точок цієї прямої будуть не задовольняти випадків.

    Але тому таких прямих S отримуємо

    випадків побудови ламаних задовольняють умови побудови.

    Якщо не має значення напрямок обходу ламаної то, у результаті отримуємо кількість способів побудови ПЗЛ буде

    1. Побудови простої замкнутої ламаної методом "Трикутника"

    п.1 Ідея методу

    Ідея: Нехай дано n довільних точок на площині.

    1. Вибираємо будь-яку з них, назвемо "першої". Потім беремо дві найближчі до неї точки. На цих трьох обраних точках будуємо трикутник.

    2. Беремо наступну найближчу, не зайняту точку до "першої".

    3. Шукаємо найближчий відрізок

    п.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.

    Список літератури

    1. Фаронов Turbo Pascal 7.0.

    2. Погорєлов А.В. Геометрія: Навчальний посібник для вузів. - 2-е вид. - М.: Наука. Головна редакція фізико-математичної літератури, 1984. - 288с.

    3. Дискретна математика для програмістів / Новиков Ф. А. - Спб.: Питер, 2001. - 304 с. : Іл.


    Додати в блог або на сайт

    Цей текст може містити помилки.

    Програмування, комп'ютери, інформатика і кібернетика | Курсова
    106.6кб. | скачати


    Схожі роботи:
    Крива Філліпса. Гіпотеза природного рівня. Теорія «економіки пропозиції». Крива Лаффера
    Проста лінійна регресія
    Шизофренія проста форма
    Оподаткування Крива Лаффера
    Сукупний попит і його крива
    Короткострокова крива пропонування фірми і галузі
    Проста формула для визначення коефіцієнта тертя в змащуваних дискових варіатора
    Рівноважна крива для товару повсякденного попиту
    Гоголь н. в. - На дзеркало неча пенять коли рожа крива.
    © Усі права захищені
    написати до нас