Агуулгыг алгасах

Гурвалжны чиглэлтэй талбай

$p_1$, $p_2$, $p_3$ гэсэн гурван цэг өгөгдсөн үед тэдгээрийн үүсгэсэн гурвалжны чиглэлтэй (тэмдэгтэй) талбайг тооцоол. Талбайн тэмдгийг дараах байдлаар тодорхойлно: та хавтгайд $p_1$ цэг дээр зогсоод $p_2$ руу харж байна гэж төсөөл. Та $p_2$ руу явах ба хэрэв $p_3$ таны баруун талд байвал (тэгвэл бид гурван вектор "цагийн зүүний дагуу" эргэж байна гэж хэлнэ) талбайн тэмдэг сөрөг, эс бөгөөс эерэг байна. Хэрэв гурван цэг коллинеар бол талбай тэг байна.

Энэ тэмдэгтэй талбайг ашиглан бид энгийн тэмдэггүй талбайг (тэмдэгтэй талбайн үнэмлэхүй утга болгон) авч болох ба мөн цэгүүд өгөгдсөн дарааллаараа цагийн зүүний дагуу эсвэл эсрэг орших эсэхийг тодорхойлж болно (энэ нь жишээ нь гүдгэр бүрхүүлийн алгоритмуудад хэрэгтэй).

Тооцоолол

Бид $2\times 2$ матрицын тодорхойлогч нь матрицын баганын (эсвэл мөрийн) векторуудын татсан параллелограммын тэмдэгтэй талбайтай тэнцүү гэсэн баримтыг ашиглаж болно. Энэ нь 2 хэмжээст орон зайд вектор үржвэрийн тодорхойлолттой ижил төстэй (Үндсэн геометр-ийг үз). Энэ талбайг хоёрт хуваснаар бид сонирхож буй гурвалжны талбайг авна. Бид $\vec{p_1p_2}$ ба $\vec{p_2p_3}$-г баганын вектор болгон ашиглаж, $2\times 2$ тодорхойлогчийг тооцоолно:

$$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)$$

Implementation

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;
}

Дасгал бодлогууд