• 编程:判断一个点是否在三角形内部


    题目描述:

    在二维坐标系中,所有的值都是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;
    }
    
  • 相关阅读:
    dnn
    DATAGRID学习
    在.net下的换行符
    treeview
    《25项最优时间管理工具与技巧》
    vim常用操作
    【Google给毕业生的忠告】
    MySQL的安装、使用及权限管理
    各种国际化标准组织
    ubuntu thunderbird 邮箱 163 配置 不能发送问题
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12231131.html
Copyright © 2020-2023  润新知