середа, 15 листопада 2017 р.

Лабораторна робота №3.1

Тема. Векторний добуток, напрямок повороту вектора, визначення площі многокутника
Мета. Формування навиків розв’язання задач геометричного змісту
Завдання 1
1. Визначити довжину відрізків AB та CD, заданого координатами вершин, записаними в текстовому полі у форматі:

xA yA
xB yB
xC yC
xD yD
та вивести значення довжин з точністю до сотих до текстового поля у форматі: AB=…; CD=…
2. Вивести рівняння прямих, на яких лежать дані відрізки та вивести їх до текстового поля у форматі:
a1x+b1y+c1=0
a2x+b2y+c2=0
3. Визначити координати перетину цих прямих та вивести їх до третього текстового поля у форматі: (x;y).
Математична модель задачі
Для визначення довжини відрізка використовуємо формулу:
Для визначення коефіцієнтів прямої:
a1=y2-y1; b1=x1-x2; c1=y1x2-x1y2.
a2=y4-y3; b2=x3-x4; c2=y3x4-x3y4.
Умова паралельності прямих:

для уникнення ділення на нуль можна перевірити одночасність виконання трьох умов:

Координати точки перетину прямих:
 

Код мовою Pascal
procedure TForm1.Button1Click(Sender: TObject);
var x,y:array[1..4] of real;
    i,w:integer;
    s,r1,r2:string;
    AB, CD, A1, B1, C1, A2, B2, C2, Xp, Yp:real;
begin
        //Зчитуємо координати
        For i := 1 To Memo1.Lines.Count do begin
            s := Memo1.Lines[i-1];
            s := Trim(s);
            while pos('  '{2 пробіли},s)<>0 do delete(s,pos('  '{2 пробіли},s),1);
            If (s <> '') and (pos(' '{1 пробіл},s)<>0) Then begin
                w := pos(' '{1 пробіл},s);
                x[i] := StrToFloat(copy(s,1,w-1));
                y[i] := StrToFloat(copy(s,w+1,Length(s)-w));
            end
        end;
        //Визначаємо довжини відрізків
        AB := Sqrt(sqr(x[1] - x[2]) + sqr(y[1] - y[2]));
        CD := Sqrt(sqr(x[3] - x[4]) + sqr(y[3] - y[4]));
        //Визначаємо рівняння прямих
        A1 := y[2] - y[1];
        B1 := x[1] - x[2];
        C1 := y[1] * x[2] - x[1] * y[2];
        A2 := y[4] - y[3];
        B2 := x[3] - x[4] ;
        C2 := y[3] * x[4] - x[3] * y[4];
        //Перевіряємо прямі на співпадання
        If (A1 = A2) And (B1 = B2) And (C1 = C2) Then
            s := 'Прямі співпадають'
        Else
            //Перевіряємо прямі на паралельність
            If (A1 * B2 = A2 * B1) And (B1 * C2 = B2 * C1) And (C1 <> C2) Then
                s := 'Прямі паралельні'
            Else begin
                //Визначаємо координати точки перетину
                Xp := (C1 * B2 - C2 * B1) / (A1 * B2 - A2 * B1);
                Yp := (A1 * C2 - A2 * C1) / (A1 * B2 - A2 * B1);
                s := '('+FloatToStrF(Xp,ffFixed,5,2)+';'+FloatToStrF(Yp,ffFixed,5,2)+')';
            End;
        //Виводимо результати
        Edit1.Text := 'AB='+FloatToStrF(AB,ffFixed,5,2)+'; CD='+FloatToStrF(CD,ffFixed,5,2);
        r1 := FloatToStrF(A1,ffFixed,5,2)+'x+'+FloatToStrF(B1,ffFixed,5,2)+'y+'+FloatToStrF(C1,ffFixed,5,2)+'=0';
        r2 := FloatToStrF(A2,ffFixed,5,2)+'x+'+FloatToStrF(B2,ffFixed,5,2)+'y+'+FloatToStrF(C2,ffFixed,5,2)+'=0';
        w :=pos('+-',r1); if w>0 then delete(r1,w,1);
        w :=pos('+-',r2); if w>0 then delete(r2,w,1);
        Memo2.Text :='';
        Memo2.Lines.Add(r1);
        Memo2.Lines.Add(r2);
        Edit2.Text := s;
end;



Завдання 2
Розробити та реалізувати у вигляді програми алгоритм визначення напряму повороту від заданої точки з координатами (x1;y1до іншої точки з координатами (x2;y2у разі, коли спостереження ведеться з початку координат (0;0).
Приклад вхідних та вихідних даних:
Edit1.Text                                           Edit2.Text                             Edit3.Text
0 1,5                                                   5 10,5                                    За годинниковою стрілкою

Математична модель:
Якщо розглядати поворот векторів необхідно з початку координат, то
умова повороту за годинниковою стрілкою:

умова повороту проти годинникової стрілки:

умова співпадання за напрямком:


Якщо розглядати треба не  з початку координат, а з деякої довільної точки (x0;y0), то вираз  слід замінити на 

Код мовою Pascal
procedure TForm1.Button1Click(Sender: TObject);
var  x1, y1, x2, y2, r : real;
     s:string;
     w:integer;
begin
        //Зчитування вхідних даних
        s := Trim(Edit1.Text);
        w:=pos(' ',s);
        x1 := StrToFloat(copy(s,1,w-1));
        y1 := StrToFloat(copy(s,w+1,Length(s)-w));
        s := Trim(Edit2.Text);
        w:=pos(' ',s);
        x2 := StrToFloat(copy(s,1,w-1));
        y2 := StrToFloat(copy(s,w+1,Length(s)-w));
        //Перевірка та виведення результату
        r := x1 * y2 - x2 * y1;
        If r < 0 Then
            Edit3.Text := 'За годинниковою стрілкою'
        Else
            If r > 0 Then
                 Edit3.Text := 'Проти годинникової стрілки'
            Else
                Edit3.Text := 'Немає повороту';
end;
Завдання 3
Визначити площу многокутника, утвореного точками, координати яких записано до текстового поля у форматі: (x1;y1)(x2;y2), … , (xn;yn). Площу обчислити з точністю до 0,01 та вивести до другого текстового поля.
Приклад вхідних та вихідних даних:
Edit1.Text                                                                  Edit2.Text
(0;0,5),(0;10,5),(10;0,5)                                             50,00
Алгоритм
1. Із текстового поля до рядкової змінної  записати вхідні дані.
2. Визначити кількість вершин многокутника, порахувавши кількість символів «;» в рядку.
3. Записати з рядка дані до масивів координат x та y.
4. Розраховуємо площу багатокутника за формулою: .
5. Виведемо шукану площу до текстового поля.
 Код мовою Pascal
procedure TForm1.Button1Click(Sender: TObject);
var  s1, s2 : String;
     i,n:integer;
     w,w2:integer;
     x,y:array[1..100] of real;
     p1,p2:string;
     s:real;
begin
        s1 := Trim(Edit1.Text);
        s2 := '';
        For i := 1 To Length(s1) do
            If s1[i] <> ' ' Then s2 := s2+ s1[i];
        //Визначаємо кількість вершин
        n:=0;
        For i := 0 To Length(s2) - 1 do
            If s2[i] = ';' Then n :=n+1;
        //Замінюємо символи "),(" на "*" для полегшення розділення рядка на вершини
        w:=pos('),(',s2);
        while w>0 do begin
          w:=pos('),(',s2);
          if w>0 then begin
            delete(s2,w,3);
            insert('*',s2,w);
          end;
        end;
        //Вилучаємо першу та останню дужки
        delete(s2,1,1); delete(s2,length(s2),1);
        //Визначаємо координати вершин
        s2:=s2+'*';
        For i := 1 To n do begin
            w:=pos(';',s2);
            w2:= pos('*',s2);
            x[i] := StrToFloat(copy(s2,1,w-1));
            y[i] := StrToFloat(copy(s2,w+1,w2-w-1));
            delete(s2,1,w2);
        end;
        Edit2.Text:=FloatToStr(x[n])+' '+FloatToStr(y[n]);
        //Визначаємо площу
        s := x[1] * y[n] - x[n] * y[1];
        For i := 1 To n - 1 do
            s := s + x[i + 1] * y[i] - x[i] * y[i + 1];
        s := 0.5 * Abs(s);
        //Виводимо результат у форматованому вигляді
        Edit2.Text := FloatToStrF(s,ffFixed,6,2);
end;

Завдання для самостійного виконання
Обчислити площу фігури заданої на малюнку у вашому варіанті

Література

Караванова, Т.П. Інформатика: методи побудови алгоритмів та їх аналіз: обчисл. алгоритми: навч. посіб. для 9-10 кл. з поглибл. вивч. інформатики. Т.П.Караванова.– К.: Генеза, 2009. – 336 с.: іл. – Бібліогр.: с. 331. (Сторінки 242-256)

Немає коментарів:

Дописати коментар