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

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

Маючи три точки 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=∣x2−x1x3−x2y2−y1y3−y2∣=(x2−x1)(y3−y2)−(x3−x2)(y2−y1)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;
}

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

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