有关射线法的详细介绍在这里给出一个讲的很好的博客链接:
https://blog.csdn.net/jq_develop/article/details/44981127
接着给出代码模板,以UVA-634作为模板测试,题目链接如下:
https://vjudge.net/problem/UVA-634
//写在前面
//判断点是否在多边形内部最好的方法就是射线法,在实际
//应用中有几种特殊情况需要处理
//1、点与多边形的顶点重合 2、点在多边形的一条边上
//另外需要注意的一点是:当射线穿过多边形的一个顶点时
//我们认为这个点是在射线的上方.只有当线段的两个顶点分别在
//射线的两侧时我们才认为射线与该多边形的这条线段有一个交点
//这里以UVA-634作为样例进行说明
#include <iostream>
#include <string.h>
#include <cmath>
#define maxn 1005
#define eps 1e-8
using namespace std;
struct node
{
int x,y;
node(int a,int b){x=a;y=b;}
node(){};
};
int n;
node point[maxn];//保存多边形顶点数组
bool solve(node yo)
{
int ox=yo.x,oy=yo.y;
int num=0;
for(int i=0;i<n-1;i++)
{
int sx=point[i].x,sy=point[i].y;
int ex=point[i+1].x,ey=point[i+1].y;
if((ox==sx&&oy==sy)||(ox==ex&&oy==ey)){return true;}//判断点是否与多边形的顶点重合
if((sy>=oy&&ey<oy)||(ey>=oy&&sy<oy))//当线段的端点位于射线的上下两侧时
{
double midx;
midx=sx+(oy-sy)*(ex-sx)*1.0/(ey-sy);//计算直线与线段的交点
double rx=ox;
if(fabs(midx-rx)<eps)//判断点是否在多边形的边上
{return true;}
if(midx>rx)num++;
}
}
if(num%2){return true;}//当与多边形有奇数个交点时
else return false;
}
int main()
{
while(cin>>n&&n)
{
for(int i=0;i<n;i++)cin>>point[i].x>>point[i].y;
node ver;
cin>>ver.x>>ver.y;
if(solve(ver))cout<<"T\n";
else cout<<"F\n";
}
}