您的位置:首页 > 其它

判断点在三角形内外

2014-09-23 21:26 246 查看

思想:

首先要先给个公式······其实我是第一次见·······瞬间暴漏了我渣渣的屌丝本质······
三角形面积公式:S = 1 / 2 * | crossProduct(a , b) |
其中a , b为三角形三点所确定的两个向量·······三角形面积的向量叉积求法······新技能get·······
接下来转入正题,如果p在三角形内部,那么它一定可以把三角形分成三部分,三部分的面积和应该与总面积相等。当p在三角形边上或者顶点上时,面积看成0.
代码目前没想到怎么精炼······有想到的欢迎回复·······我如果想到精炼方法的话会尽快补充·······

完整代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

struct point
{
    double x;
    double y;
};

struct v
{
    point start;
    point end;
};

struct triangle
{
    point A;
    point B;
    point C;
};

double crossProduct(v *v1 , v *v2)
{
    /*
    v vt1 , vt2;
    double result = 0;

    vt1.start.x = 0;
    vt1.start.y = 0;
    vt1.end.x = v1->end.x - v1->start.x;
    vt1.end.y = v1->end.y - v1->start.y;

    vt2.start.x = 0;
    vt2.start.y = 0;
    vt2.end.x = v2->end.x - v2->start.x;
    vt2.end.y = v2->end.y - v2->start.y;

    result = vt1.end.x * vt2.end.y - vt2.end.x * vt1.end.y;
    return result;
    */
    return (v1->end.x - v1->start.x) * (v2->end.y - v2->start.y) - (v1->end.y - v1->start.y) * (v2->end.x - v2->start.x);
}

bool inTriangle(triangle t , point P)
{
    v AB , AC , BC , PA , PB , PC;
    AB.start = t.A;
    AB.end = t.B;

    AC.start = t.A;
    AC.end = t.C;

    BC.start = t.B;
    BC.end = t.C;

    PA.start = P;
    PA.end = t.A;

    PB.start = P;
    PB.end = t.B;

    PC.start = P;
    PC.end = t.C;

    double Sabc = fabs(crossProduct(&AB , &AC));
    double Spab = fabs(crossProduct(&PA , &PB));
    double Spac = fabs(crossProduct(&PC , &PA));
    double Spbc = fabs(crossProduct(&PB , &PC));
    if(Sabc == Spab + Spac + Spbc)
        return true;
    else
        return false;
}

int main()
{
    triangle t;
    point p;
    cin >> t.A.x >> t.A.y;
    cin >> t.B.x >> t.B.y;
    cin >> t.C.x >> t.C.y;
    cin >> p.x >> p.y;
    if(inTriangle(t , p))
        cout << "Q点在三角形ABC内" << endl;
    else
        cout << "Q点不在三角形ABC内" << endl;
}

/*
3 3
0 0
4 0
2 2
Q点在三角形ABC内
*/

/*
3 3
0 0
4 0
1 2
Q点不在三角形ABC内
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: