編程:判斷一個點是否在三角形內部


題目描述:

在二維坐標系中,所有的值都是double類型,那么一個三角形可以由3個點來代表,給定3個點代表的三角形,再給定一個點(x, y),判斷(x, y)是否在三角形中

題目分析:

方法1:面積法:如果點(x, y)在三角形內部,那么三個小三角形的面積相加等於大三角形面積。

注意:已知三角形三個點,求三角形面積。
image

方法2:向量法:如果點(x, y)在三角形內部,那么從某個點逆時針出發,點(x, y)都在每條邊的左側。

注意:判斷一個點在一個有向邊的左側還是右側。
image

#include<iostream>

using namespace std;

double crossProduct(double x1, double y1, double x2, double y2)
{
    return x1 * y2 - x2 * y1;
}

bool isInside(double x1, double y1, double x2, double y2, 
              double x3, double y3, double x, double y)
{
    //注意輸入點的順序不一定是逆時針,需要判斷一下
    if(crossProduct(x3 - x1, y3 - y1, x2 - x1, y2 - y1) >= 0)
    {
        double tmpx = x2;
        double tmpy = y2;
        x2 = x3;
        y2 = y3;
        x3 = tmpx;
        y3 = tmpy;
    }
    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()
{
    double x1, y1, x2, y2, x3, y3, x, y;
    cin >> x1 >> y1;
    cin >> x2 >> y2;
    cin >> x3 >> y3;
    cin >> x >> y;
    if(isInside(x1, y1, x2, y2, x3, y3, x, y)) cout << "Yes" << endl;
    else cout << "No" << endl;
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM