判斷點是否在三角形內

安娜アンナ發表於2024-12-10

我個人常用的方法多為叉積法,而不是面積法。

原因很簡單,相較來說叉積法速度會比面積法更快一些。(個人測,並不嚴謹)

判斷點是否在三角形內

其實根據右手定則,我們很容易可以判斷出點是否在三角形中,我們只需要判斷點是否在三個向量的左側即可;

判斷點是否在三角形內

但在一開始,我們需要先判斷三角形時候為逆時針,即點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;
}
    

相關文章