题目链接:https://hihocoder.com/contest/hiho225/problem/1
方法1:射线法
注意:在直线上和端点上的情况。
1 //判断一个点是否在三角形内 2 //方法1:射线法 3 #include <cstdio> 4 #include <cstring> 5 6 7 8 using namespace std; 9 10 bool F; 11 int cnt=0; 12 double px,py; 13 double x[4],y[4]; 14 15 void check(int id1,int id2){ 16 if((x[id1]==px&&y[id1]==py)||(x[id2]==px&&y[id2]==py)) {F=1;return;} 17 if((y[id1]<py&&y[id2]>=py)||(y[id1]>=py&&y[id2]<py)){ 18 double X=x[id1]+(py-y[id1])*(x[id1]-x[id2])/(y[id1]-y[id2]); 19 if(X==px){ 20 F=1; 21 return; 22 } 23 if(X>px) cnt++; 24 } 25 } 26 27 int main(){ 28 int t; 29 scanf("%d",&t); 30 31 while(t--){ 32 F=0;cnt=0; 33 scanf("%lf%lf",&px,&py); 34 for(int i=1;i<=3;i++) scanf("%lf%lf",&x[i],&y[i]); 35 check(1,2);check(1,3);check(2,3); 36 if( F || (cnt%2) ) printf("YES\n"); 37 else printf("NO\n"); 38 } 39 40 return 0; 41 }
方法2:面积法(推公式,梯形面积)
1 //判断一个点是否在三角形内 2 //方法2:面积法 3 #include <cmath> 4 #include <cstdio> 5 #include <cstring> 6 #include <iostream> 7 #include <algorithm> 8 using namespace std; 9 10 typedef long long ll; 11 ll px,py; 12 ll x[4],y[4]; 13 14 ll area(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3){ 15 return abs((y1-y2)*(x1-x3)+(y1-y3)*(x2-x1)); 16 } 17 18 int main(){ 19 int t; 20 scanf("%d",&t); 21 22 while(t--){ 23 scanf("%lld%lld",&px,&py); 24 for(int i=1;i<=3;i++){ 25 scanf("%lld%lld",&x[i],&y[i]); 26 } 27 ll S=area(x[1],y[1],x[2],y[2],x[3],y[3]); 28 ll S1=area(px,py,x[2],y[2],x[3],y[3]); 29 ll S2=area(x[1],y[1],px,py,x[3],y[3]); 30 ll S3=area(x[1],y[1],x[2],y[2],px,py); 31 if(S==(S1+S2+S3)) printf("YES\n"); 32 else printf("NO\n"); 33 } 34 35 return 0; 36 }