hiho 第225周 Inside Triangle(判断一个点是否在三角形内)

题目链接: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 }
View Code

方法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 }
View Code

猜你喜欢

转载自www.cnblogs.com/ehanla/p/9858074.html