1.判断点是否在三角形内部
struct Point{ //点
double x,y;
};
struct Vr{ //向量
Point s,e;
};
double cross(Vr * v1, Vr * v2) //叉积
{
double result=0;
result=(v1->e.x-v1->s.x)*(v2->e.y-v2->s.y)-(v2->e.x-v2->s.x)*(v1->e.y-v1->s.y);
return result;
}
struct triangle
{
Point A,B,C;
};
bool InTriangle(triangle t, Point p)
{
Vr AB,AC,PA,PB,PC;
AB.s=t.A;
AB.e=t.B;
AC.s=t.A;
AC.e=t.C;
PA.s=p;
PA.e=t.A;
PB.s=p;
PB.e=t.B;
PC.s=p;
PC.e=t.C;
double abc=fabs(cross(&AB, &AC));
double pab=fabs(cross(&PA,&PB));
double pac=fabs(cross(&PA,&PC));
double pbc=fabs(cross(&PC,&PB));
if(pab+pac+pbc==abc) return true;
return false;
}
2.判断点是否在多边形内部
#include<cmath>
#include<iostream>
#include<algorithm>
#define eps 1.0e-5
using namespace std;
struct Point{
double x,y;
};
Point poly[110];
bool online(Point p1,Point p,Point p3)
{
if(p.x>=min(p1.x,p3.x)&&p.x<=max(p1.x,p3.x)
&&p.y>=min(p1.y,p3.y)&&p.y<=max(p1.y,p3.y)){
if(fabs((p.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p.y-p1.y))<=eps)
return true;
}
return false;
}
int n,m;
bool InPoly(Point p)
{
int cnt=0;
double xx;
Point p1,p2;
p1=poly[0];
for(int i=1;i<=n;i++){
p2=poly[i%n];
if(online(p1,p,p2)) return true; //在多边形的一条边上
if(p.y>min(p1.y,p2.y)){
if(p.y<=max(p1.y,p2.y)){
if(p.x<=max(p1.x,p2.x)){
if(p1.y!=p2.y){
xx=(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y) +p1.x;
if(p.x<=xx) cnt++;
}
}
}
}
p1=p2;
}
if(cnt%2==0) return false;
return true;
}