內心裡的一把火(判斷平面內的點是否在三角形內)

ZMST發表於2019-01-01

題目連結:

【分析】

給定平面上一點p(x0,y0),判斷該點是否在三角形ABC中,三角形頂點座標分別為A(xa,xb),B(xb,yb),C(xc,yc)。可以使用面積法來判斷,方法如下:其中S(A,B,C)表示三角形ABC的面積。
    1、 若abs( S(A,B,C) ) = abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) ,則P在三角形ABC的內部或邊上;如果還有abs( S(P,B,C) )、abs( S(A,P,C) ) 和abs( S(A,B,P) )全都大於0,則說明P在三角形ABC的內部,否則P在三角形ABC的邊上,具體為:S(P,B,C)為0,則說明P在BC邊上,S(A,P,C)為0,則說明P在AC邊上,S(A,B,P)為0,則說明P在AB邊上; 
    2、 若abs( S(A,B,C) ) < abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) ,則P在三角形ABC的外部; 
    3、 對abs( S(A,B,C) ) > abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) 情況在理論上是不存在的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
#include <sstream>
#include <stack>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    double x1,y1,x2,y2,x3,y3;//SABC==SABp+SApC+SpBC(AB與AC的向量叉乘相減)
    while (~scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3))
    {
        double x,y;
        scanf("%lf%lf",&x,&y);
        double abx=x2-x1,aby=y2-y1;
        double acx=x3-x1,acy=y3-y1;
        double apx=x-x1,apy=y-y1;
        double pbx=x2-x,pby=y2-y;
        double pcx=x3-x,pcy=y3-y;
        if(fabs(abx*apy-aby*apx)/2+fabs(apx*acy-apy*acx)/2+fabs(pbx*pcy-pby*pcx)/2==fabs(acx*aby-abx*acy)/2)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}

就是面積選取哪兩個向量得有規定

float GetTriangleSquar(const point_float pt0, const point_float pt1, const point_float pt2)
{
	point_float AB,   BC;    
	AB.x = pt1.x - pt0.x;   
	AB.y = pt1.y - pt0.y;   
	BC.x = pt2.x - pt1.x;   
	BC.y = pt2.y - pt1.y;     
	return fabs((AB.x * BC.y - AB.y * BC.x)) / 2.0f;    
}

 

相關文章