巨人网络2018校招在线笔试-代码题

题目

描述

给定一个三角形 ABC,一点 P,求 P 是否在三角形 ABC 内部

题解

思路

  • 点 P 和点 C 在 向量 AB 同侧
  • 点 P 和点 B 在 向量 AC 同侧
  • 点 P 和点 A 在 向量 BC 同侧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int crossPro(int o[2],int p1[2],int p2[2])
{
int u[]={p1[0]-o[0],p1[1]-o[1]};
int v[]={p2[0]-o[0],p2[1]-o[1]};
return u[0]*v[1]-u[1]*v[0];
}

bool sameSide(int ls[2],int le[2],int p1[2],int p2[2])
{
int cP[2];
cP[0]=crossPro(ls,le,p1);
cP[1]=crossPro(ls,le,p2);
return cP[0]*cP[1]>0;
}

bool inner(int triangle[3][2],int p[2])
{
bool sS[3];
sS[0]=sameSide(triangle[0],triangle[1],triangle[2],p);
sS[1]=sameSide(triangle[0],triangle[2],triangle[1],p);
sS[2]=sameSide(triangle[1],triangle[2],triangle[0],p);
return sS[0]&&sS[1]&&sS[2];
}