Перейти до основного вмісту

Орієнтована площа трикутника

Маючи три точки p1p_1, p2p_2 і p3p_3, обчислимо орієнтовану (зі знаком) площу трикутника, утвореного ними. Знак площі визначається так: уявімо, що ми стоїмо в площині в точці p1p_1 і дивимося в напрямку p2p_2. Ми йдемо до p2p_2, і якщо p3p_3 опиняється праворуч від нас (тоді кажемо, що три вектори повертають «за годинниковою стрілкою»), то знак площі від'ємний, інакше — додатний. Якщо три точки лежать на одній прямій, площа дорівнює нулю.

Використовуючи цю площу зі знаком, ми можемо отримати як звичайну площу без знака (як абсолютне значення площі зі знаком), так і визначити, чи лежать точки за годинниковою стрілкою, чи проти годинникової стрілки в заданому порядку (що корисно, наприклад, в алгоритмах побудови опуклої оболонки).

Обчислення

Ми можемо скористатися тим фактом, що визначник матриці 2×22\times 2 дорівнює площі зі знаком паралелограма, натягнутого на вектори-стовпці (або вектори-рядки) цієї матриці. Це аналогічно означенню векторного добутку в 2D (див. Базова геометрія). Поділивши цю площу на два, ми отримаємо площу трикутника, яка нас цікавить. Ми використаємо p1p2\vec{p_1p_2} і p2p3\vec{p_2p_3} як вектори-стовпці й обчислимо визначник 2×22\times 2:

2S=x2x1x3x2y2y1y3y2=(x2x1)(y3y2)(x3x2)(y2y1)2S=\left|\begin{matrix}x_2-x_1 & x_3-x_2\\y_2-y_1 & y_3-y_2\end{matrix}\right|=(x_2-x_1)(y_3-y_2)-(x_3-x_2)(y_2-y_1)

Реалізація

int signed_area_parallelogram(point2d p1, point2d p2, point2d p3) {
return cross(p2 - p1, p3 - p2);
}

double triangle_area(point2d p1, point2d p2, point2d p3) {
return abs(signed_area_parallelogram(p1, p2, p3)) / 2.0;
}

bool clockwise(point2d p1, point2d p2, point2d p3) {
return signed_area_parallelogram(p1, p2, p3) < 0;
}

bool counter_clockwise(point2d p1, point2d p2, point2d p3) {
return signed_area_parallelogram(p1, p2, p3) > 0;
}

Задачі для практики

Відеоматеріали