Условие
Четырёхугольник [latex]ABCD[/latex] задан координатами своих вершин на плоскости: [latex]A(x_a,y_a)[/latex], [latex]B(x_b,y_b)[/latex] и [latex]C(x_c,y_c)[/latex], [latex]D(x_d,y_d)[/latex]. Определить тип четырёхугольника: прямоугольник, параллелограмм, трапеция, произвольный четырёхугольник. Учесть погрешность вычислений.
Замечание: Для устранения дополнительных источников погрешности рекомендуется использовать аппарат векторной алгебры: коллинеарность, равенство и ортогональность векторов — сторон четырёхугольника.
Входные данные
В одной строке заданы 8 чисел [latex]x_a, x_b, x_c, x_d, y_a, y_b, y_c, y_d[/latex] — координаты вершин четырёхугольника [latex]ABCD[/latex], значения которых не превышают по модулю [latex]50[/latex].
Выходные данные
- В первой строке вывести: «Тип четырёхугольника: «(без кавычек).
- Во второй строке вывести: «Произвольный четырёхугольник» или «Прямоугольник» или «Параллелограмм» или «Трапеция»(без кавычек). Одно исключает другое.
Также условие задачи можно посмотреть, скачав ознакомительную версию задачника А.Юркина здесь.
Тестирование
№ |
Координаты [latex]x_a, x_b, x_c, x_d, y_a, y_b, y_c, y_d[/latex] |
Вердикт (тип четырёхугольника) |
1. |
-5 -4 -1 -2 -4 3 -1 -8 |
Параллелограмм |
2. |
-2 -3 7 3 -2 1 7 1 |
Трапеция |
3. |
0 0 1 1 0 1 1 0 |
Прямоугольник |
4. |
50 -20 3 -50 7 6 2 3 |
Произвольный четырёхугольник |
5. |
2 -3 -6 -1 4 7 6 3 |
Параллелограмм |
6. |
1 -5 6 20 2 0 13 -9 |
Произвольный четырёхугольник |
7. |
0 1 2 1 0 1 1 0 |
Параллелограмм |
8. |
-6 0 6 0 1 5 -4 -8 |
Прямоугольник |
Реализация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#include <iostream> #include <cmath> using namespace std; int main () { setlocale(LC_ALL,"Russian"); int xa, xb, xc, xd, ya, yb, yc, yd; cout << "Тип четырёхугольника: " << endl; cin >> xa >> xb >> xc >> xd >> ya >> yb >> yc >> yd; //диагонали AC и BD четырёхугольника ABCD обозначим, как l и m, они являются векторами long double l= abs(sqrt((xc - xa) * (xc - xa) + (yc - ya) * (yc -ya))); long double m= abs(sqrt((xd - xb) * (xd - xb) + (yd - yb) * (yd -yb))); if (((xc - xb) * (yd - ya) == (xd - xa) * (yc - yb)) || ((xb - xa) * (yc - yd) == (xc - xd) * (yb - ya))) { if (((xb - xa) * (yc - yd) == (xc - xd) * (yb - ya)) && ((xc - xb) * (yd - ya) == (xd - xa) * (yc - yb))) if (l==m) cout << "Прямоугольник" << endl; else { cout << "Параллелограмм" << endl; } else { cout << "Трапеция" << endl; } } else { cout << "Произвольный четырехугольник" << endl; } return 0; } |
Алгоритм решения
- Задан четырёхугольник [latex]ABCD[/latex] с такими координатами вершин: [latex]A(x_a,y_a)[/latex], [latex]B(x_b,y_b)[/latex], [latex]C(x_c,y_c)[/latex] и [latex]D(x_d,y_d)[/latex]. В данной задаче будет уместным использование аппарата векторной алгебры. Пусть стороны четырёхугольника — векторы.
- Очевидно, что для того, чтобы определить тип данного четырёхугольника, необходимо воспользоваться известными свойствами, а именно: свойствами прямоугольника, параллелограмма и трапеции. Так как в задаче используется аппарат векторной алгебры, обращаемся к таким свойствам векторов, как коллинеарность и равенство.
- Сразу же установим: является ли четырёхугольник трапецией. Проверим одну из двух пар сторон на параллельность. Для этого воспользуемся условием коллинеарности векторов на плоскости: [latex]\frac{a_x}{b_x}=\frac{a_y}{b_y}[/latex], если [latex]a_i, b_i\ne0[/latex]. Координаты векторов [latex]\vec{b}[/latex] и [latex]\vec{d}[/latex] должны быть пропорциональны, что означает, что соответствующие стороны параллельны. Следовательно, [latex]\frac{x_c — x_b}{x_d — x_a}=\frac{y_c — y_b}{y_d — y_a}[/latex]. Или же координаты векторов [latex]\vec{a}[/latex] и [latex]\vec{c}[/latex] должны быть пропорциональны. Проверяем: [latex]\frac{x_b — x_a}{x_c — x_d}=\frac{y_b — y_a}{y_c — y_d}[/latex]. Если условие не выполняется, четырёхугольник произвольный. Если, напротив, координаты хотя бы одной пары векторов пропорциональны, четырёхугольник является трапецией.
- Если четырёхугольник — параллелограмм, то обе пары его противоположных сторон параллельны. Проверим, выполняется ли: [latex]\frac{x_b — x_a}{x_c — x_d}=\frac{y_b — y_a}{y_c — y_d}[/latex] и [latex]\frac{x_c — x_b}{x_d — x_a}=\frac{y_c — y_b}{y_d — y_a}[/latex]. Если условие выполняется, то заданный четырёхугольник — параллелограмм.
- Частным случаем параллелограмма является прямоугольник. Диагонали [latex] AC, BD[/latex] обозначим как [latex] l, m[/latex] соответственно. Пусть [latex] l, m[/latex] — векторы. Вычислим длины векторов [latex]\vec{l}[/latex], [latex]\vec{m}[/latex], пользуясь формулой. Получаем: [latex]\vec{|l|}= \sqrt{(x_c — x_a)\cdot (x_c -x_a) + (y_c — y_a)\cdot (y_c -y_a)}[/latex], [latex]\vec{|m|}= \sqrt{(x_d — x_b)\cdot (x_d -x_b) + (y_d — y_b)\cdot (y_d -y_b)}[/latex]. При условии, что [latex]\vec{l}=\vec{m}[/latex], имеем прямоугольник.
Более детально со свойствами и видами четырёхугольников можно ознакомиться здесь, а с основными сведениями из векторной алгебры — здесь.
Для запроса на выполнение следует перейти по ссылке.
Related Images: