Тема.
Векторний добуток, напрямок повороту вектора, визначення площі многокутника
Мета. Формування
навиків розв’язання задач геометричного змісту
Завдання 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)
Немає коментарів:
Дописати коментар