资产阶级
- 积分
- 48817
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2011-4-11
- 最后登录
- 1970-1-1
|
本帖最后由 yxyxyx 于 2011-5-13 16:41 编辑
可以用射线法解决。
也就是说从待判定点做向x轴正方向的射线,其和多边形的边(或点)有交点,基本概念是统计总交点数,奇数则在多边形内,偶数则在多边形外。
当然,其中还要考虑交点就是多边形顶点神马的。
我写了一个,自己测试了一下,应该是对的:)。判定函数是那个exam函数
- #include<iostream>
- using namespace std;
- int exam(float x1, float y1, float x2, float y2, float xp, float yp)
- {
- int flag;
- if(x1==x2)//perallel to y axis
- {
- if(xp < x1)
- {
- if( (yp-y1)*(yp-y2)<0 || yp==y2)
- {
- flag = 1;
- }
- else flag=0;
- }
- else flag=0;
- }
- else if(y1==y2)//perallel to x axis
- {
- if(yp==y2 && xp<x1 && xp<x2) flag=1;
- else flag=0;
- }
- else
- {
- float k=(x1-x2)/(y1-y2)*(yp-y2)+x2;
- if(xp < k && ((k-x1)*(k-x2)<0 || k==x2)) flag=1;
- else flag=0;
- }
- return flag;
- }
- int main()
- {
- int num;
- cin >> num;
- float *x=new float[num];
- float *y=new float[num];
- for (int i = 0; i < num; ++i)
- {
- cin >> x[i] >> y[i];
- }
- float xp, yp;
- cin >> xp >> yp;
- //start examining every side
- int t=0;
- for (int i = 0; i < num-1; i++)
- {
- t+=exam(x[i],y[i],x[i+1],y[i+1],xp,yp);
- }
- t+=exam(x[num-1],y[num-1],x[0],y[0],xp,yp);
- if(t%2==1) cout << "in!" << endl;
- else cout << "out!" << endl;
- delete []x;
- delete []y;
- return 0;
- }
复制代码 |
|