="justify"> 5. field.add_point_str (point_x.Text, point_y.text);
6. field.update_list;
. end;
Тут відбувається виклик процедури додавання точки в список (add_point_str) і оновлення списку точок.
Лістинг методу add_point_str наведено нижче.
1. procedure tfield.add_point_str (_x, _y: string);
2. var
. x, y: Integer;
. begin
5. if not is_digit (_x) or not is_digit (_y)
6. then
. begin
. ShowMessage ( Помилка введення );
. Exit;
. end;
. x:=StrToInt (_x);
. y:=StrToInt (_y);
13. add_point_int (x, y);
14. end;
Тут перевіряється коректність введених даних (рядки 5-10), перетворення строкових координат в числові і додавання в список методом add_point_int.
. Пошук квадратів
Для пошуку всіх квадратів введемо метод, який визначає, можливість побудови квадрата з вершинами в точках p1, p2, p3, p4.
1. function tfield.is_bar (p1, p2, p3, p4: tmypoint): Boolean;
2. var d1, d2, d3, d4: double;
3. begin
. d1:=distance (p1, p2);
. d2:=distance (p2, p3);
. d3:=distance (p3, p4);
. d4:=distance (p4, p1);
8. Result:=(d1=d2) and (d2=d3) and (d3=d4) and (d4=d1) and (d1 lt; gt; 0);
9. end;
Рішення про можливість побудувати квадрат з координатами в точках p1, p2, p3, p4 приймається на основі наступного твердження: відстань між точками p1 і p2 збігається з відстанями між точками p2 і p3, p3 і p4, p4 і p1.
При при цьому ця відстань не дорівнює 0, то можливо побудувати квадрат з вершинами в точках p1, p2, p3, p4, в іншому випадку така побудова неможливо.
Метод distance виглядає наступним чином.
1. function tfield.distance (p1, p2: tmypoint): Double;
2. begin
3. Result:=(Sqrt (Sqr (p2.x - p1.x) + Sqr (p2.y - p1.y)));
4. end;
Метод, який здійснює пошук квадратів.
1. procedure tfield.gen_bars ();
2. var
3. i1, i2, i3, i4, acnt: Integer;
4. begin
. acnt:=0;
. for i1:=0 to cnt - 1 do
7. for i2:=i1 + 1 to cnt - 1 do
. for i3:=i2 + 1 to cnt - 1 do
. for i4:=i3 + 1 to cnt - 1 do
. if is_bar (points [i1], points [i2], points [i3], points [i4])
11. then
. begin
13. drawbar (points [i1], points [i2], points [i3], points [i4]);
14. inc (acnt);
. end;
. ShowMessage (IntToStr (acnt) + квадратів знайдено );
. end;
У результаті своєї роботи метод виводить на екран число квадратів з вершинами в даних точках, а також малює їх на поле для виводу.
У рядку 5 инициализируется значення лічильника квадратів.
У рядках 6-9 організовується перебір всіх можливих четвірок точок.
У рядку 10 перевіряється, чи можливо побудова квадрата з вершинами в поточних координатах.
У разі успішної перевірки квадрат малюється на поле для виведення (рядок 13) і збільшується лічильник квадратів (рядок 14).
У рядку 16 виводиться відповідь.
Оброблювач натискання на кнопку Розрахувати виглядає наступним чином.
1. procedure TForm1.btn1Click (Sender: TObject);
2. begin
. field.gen_bars;
. end;
. Малювання квадратів
Процедура малювання квадратів виглядає наступним чином.
1. procedure tfield.drawbar (p1, p2, p3, p4: tmypoint);
2. begin
3. Form1.img1.Canvas.MoveTo (p1.x, Form1.img1.Height ...