我個人常用的方法多為叉積法,而不是面積法。
原因很簡單,相較來說叉積法速度會比面積法更快一些。(個人測,並不嚴謹)
其實根據右手定則,我們很容易可以判斷出點是否在三角形中,我們只需要判斷點是否在三個向量的左側即可;
但在一開始,我們需要先判斷三角形時候為逆時針,即點2是否在3的左側。若不是交換位置(point變數名位置)
#include <iostream>
// 計算叉積的函式
int crossProduct(int x1, int y1, int x2, int y2) {
return x1 * y2 - x2 * y1;
}
// 判斷點是否在三角形內的函式
bool isInTri2(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y) {
// 確保三個點相對位置為逆時針方向:1 -> 2 -> 3
if (crossProduct(x2 - x1, y2 - y1, x3 - x1, y3 - y1) >= 0) {
std::swap(x2, x3);
std::swap(y2, y3);
}
if (crossProduct(x2 - x1, y2 - y1, x - x1, y - y1) <= 0) {
return false;
}
if (crossProduct(x3 - x2, y3 - y2, x - x2, y - y2) <= 0) {
return false;
}
if (crossProduct(x1 - x3, y1 - y3, x - x3, y - y3) <= 0) {
return false;
}
return true;
}
int main() {
// 示例測試
int x1 = 0, y1 = 0;
int x2 = 5, y2 = 0;
int x3 = 0, y3 = 5;
int x = 2, y = 2;
if (isInTri2(x1, y1, x2, y2, x3, y3, x, y)) {
std::cout << "Point is inside the triangle." << std::endl;
} else {
std::cout << "Point is outside the triangle." << std::endl;
}
return 0;
}