Нехай маємо дві прямі задані точками свого початку та кінця (перша пряма задана точками та і друга – та відповідно), для яких необхідно визначити координати точки їх перетину. Очевидне рішення даної задачі полягає в тому, щоб вирішити систему з двох лінійних рівнянь, які описують задані прямі.
Отже, якщо задані дві точки і , то з курсу аналітичної геометрії відомо, що рівняння прямої, яке проходить через ці точки, можна записати у наступному вигляді:
Отриманий вираз слід перетворити до вигляду загального рівняння прямої: . Для цього, звільнимо рівняння (1) від дробів, розкриємо дужки та згрупуємо доданки при невідомих.
Далі, винісши невідомі та за дужки, отримуємо рівняння прямої виду (2), коефіцієнти при невідомих та вільний член якого обчислюються за формулами:
Після того, як рівняння прямих відомі, переходимо до визначення точки їх перетину. Для цього, як уже було сказано вище, скориставшись будь-яким з відомих чисельних методів (метод Крамера, метод Гаусса, Метод простої ітерації,…), знаходимо розв’язок системи двох лінійних рівнянь з двома невідомими, і таким чином отримуємо шукані координати точки перетину.
Провіримо працездатності розглянутого алгоритму. Для цього, використовуючи середовище програмування Delphi 7, створимо новий delphi-проекту, на головній формі якого розмістимо наступні компоненти:
Далі, після слова implementation в модулі вікна оголошуємо глобальні змінні x1, y1, x2, y2, x3, y3, x4, y4 цілого типу, які відповідатимуть за координати точок початку і кінця прями та будуть доступні з будь-якої процедури в цьому модулі. А також, напишемо код для підпрограми опрацювання події OnClick компонента Button1 (кнопка “Побудувати прямі”), який реалізує процес побудови двох прямих на канві форми Form1:
x1, y1, x2, y2, x3, y3, x4, y4: integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Задаєм значення координатів точок початку і кінця прямих
x1 := StrToInt(Edit1.Text); y1 := StrToInt(Edit2.Text);
x2 := StrToInt(Edit3.Text); y2 := StrToInt(Edit4.Text);
x3 := StrToInt(Edit5.Text); y3 := StrToInt(Edit6.Text);
x4 := StrToInt(Edit7.Text); y4 := StrToInt(Edit8.Text);
// По заданих координатах здійснюємо побудову прямих
Form1.Canvas.MoveTo(x1, y1);
Form1.Canvas.LineTo(x2, y2);
Form1.Canvas.MoveTo(x3, y3);
Form1.Canvas.LineTo(x4, y4);
end;
І на останньому кроці на подію OnCkick кнопки Button2 (“Знайти точку перетину”) запишемо код відшукання координатів та візуального представлення точки перетину заданих прямих:
var
A: array[1..2, 1..2] of real;
b: array[1..2] of real;
d, d1, d2, X, Y: real;
begin
// Елементи матриці та стовпця вільних членів заповнюємо відповідними коефіцієнтами рівнянь прямих
A[1, 1] := y2 – y1; A[1, 2] := x1 – x2; b[1] := -(y1 * x2 – x1 * y2);
A[2, 1] := y4 – y3; A[2, 2] := x3 – x4; b[2] := -(y3 * x4 – x3 * y4);
// Знаходимо основний та допоміжні визначники
d := A[1, 1] * A[2, 2] – A[2, 1] * A[1, 2];
d1 := b[1] * A[2, 2] – b[2] * A[1, 2];
d2 := A[1, 1] * b[2] – A[2, 1] * b[1];
if (Abs(d) <= 0.1) then
StatusBar1.Panels[0].Text := ‘Прямі не перетинаються!’
else
begin
// Використовуючи алгоритм методу крамера знаходимо координати точки перетину прямих
X := d1 / d;
Y := d2 / d;
Form1.Canvas.Ellipse(Round(X) – 3, Round(Y) – 3, Round(X) + 3, Round(Y) + 3);
StatusBar1.Panels[0].Text := ‘Прямі перетинаються в точці з координатами (‘ + FloatToStr(X) + ‘, ‘ + FloatToStr(X) + ‘)’;
end;
end;
Отже, запустивши проект на виконання і задавши у відповідні поля координати початку та кінця примях, та сткориставшись відповіднимим кнопками отримуємо координати шуканої точки:
Скачати delphi-проект “Відшукання точки перетину двох прямих”.