Broken line - SGU 124(判断点与多边形的关系)
题目大意:RT
分析:构造一条射线,如果穿越偶数条边,那么就在多边形外面,如果穿越奇数条边,那么就在多边形里面。
代码如下:
===========================================================================================================================
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std; const int MAXN = 1e4+;
const double EPS = 1e-;
const double FarX = 1e5+; int Sign(double x)
{
if(x > EPS)return ;
if(fabs(x) <= EPS)return ;
return -;
} struct point
{
double x, y;
point(double x=, double y=):x(x),y(y){}
point operator - (const point &t)const{
return point(x-t.x, y-t.y);
}
double operator ^(const point &t)const{
return x*t.y - y*t.x;
}
};
struct segment
{
point s, e; segment(point s=, point e=):s(s), e(e){}
bool OnSeg(const point &p)
{///判断点是否在线段上
if(Sign((s-e)^(p-e)) == )///共线
if(Sign((p.x-s.x)*(p.x-e.x)) <= )///位于线段的中间或者两端
if(Sign((p.y-s.y)*(p.y-e.y)) <= )
return true;
return false;
}
bool Inter(const segment &t)
{///完全相交情况
return Sign((s-e)^(t.s-e))*Sign((s-e)^(t.e-e)) == -;
}
};
int Find(segment sg[], int N, point &p)
{///判断点与多边形的关系,在多边形上返回0,内返回1,外返回-1
///使用射线法判断,判断穿越的边是奇数还是偶数,奇数说明在里面,偶数说明在外面
segment ray(p, point(FarX, p.y));///构造射线 int cnt = ; for(int i=; i<N; i++)
{
if(sg[i].OnSeg(p))
return ;///如果点在边界上 if(ray.OnSeg(sg[i].s))///如果穿越点,记录y值小的
{///如果穿过s点
if(sg[i].e.y - sg[i].s.y > EPS)
cnt += ;
}
else if(ray.OnSeg(sg[i].e))
{
if(sg[i].s.y - sg[i].e.y > EPS)
cnt += ;
}
else if(ray.Inter(sg[i]) && sg[i].Inter(ray))
cnt += ;
} if(cnt % )
return ;
return -;
} int main()
{
segment sg[MAXN];
point A, B, p;
int i, N; scanf("%d", &N); for(i=; i<N; i++)
{
scanf("%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y);
sg[i] = segment(A, B);
}
scanf("%lf%lf", &p.x, &p.y); int ans = Find(sg, N, p); if(ans == )
printf("BORDER\n");
else if(ans == )
printf("INSIDE\n");
else
printf("OUTSIDE\n"); return ;
}
Broken line - SGU 124(判断点与多边形的关系)的更多相关文章
- C# GDI+ 利用 Rectangle GraphicsPath 判断 矩形或多边形 图形关系
最近在做一些简单的图像对比工作,总结了一些GDI+对象的使用方式,记录下来共享给大家使用. 判断Rectangl与多边形的关系 /// <summary> /// 是否包含输入范围 /// ...
- Unity3D 中判断点与多边形的关系
由点发出的射线与多边形边的交点个数,如果是偶数个说明在多边形的外面,交点个数为奇数个在多边形的内部,下面是代码: public bool IsPointInPolygon(Vector2 point, ...
- A Round Peg in a Ground Hole(判断是否是凸包,点是否在凸包内,圆与多边形的关系)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4628 Accepted: 1434 Description The D ...
- SGU 124. Broken line 射线法 eps的精准运用,计算几何 难度:3
124. Broken line time limit per test: 0.25 sec. memory limit per test: 4096 KB There is a closed bro ...
- zoj 1081 判断点在多边形内
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81Points Within Time Limit: 2 Second ...
- 判断点在多边形内算法的C++实现
目录 1. 算法思路 2. 具体实现 3. 改进空间 1. 算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标 ...
- hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- R树判断点在多边形内-Java版本
1.什么是RTree 待补充 2.RTree java依赖 rtree的java开源版本在GitHub上:https://github.com/davidmoten/rtree 上面有详细的使用说明 ...
- matlab练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
随机推荐
- java输入输出流(内容练习)
1,编写一个程序,读取文件test.txt的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.i ...
- Twisted介绍
Twisted诞生于2000年初,作者为Glyph,目的是为了开发网络游戏. Twisted的历史 Glyph开始采用Java多线程,来开发Twisted Reality,结果多线程使得开发变得复杂, ...
- 平衡搜索树(三) B-Tree
B树的简介 B 树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树.与红黑树很相似,但在降低磁盘I/0操作方面要更好一些(树的深度较低).许多数据库系统都一般使用B树或者B树的各种变形结构.B树与红 ...
- thinksns解析1
1.数据库 这儿是关于数据库的封装,还是挺厉害的,最终select中完成sql语句的封装,最后由query来完成底层api 2.初始化过程 sns也是通过框架完成显示调用,一开始通过i ...
- execute、executeUpdate、executeQuery三者的区别及返回值
一.boolean execute(String sql)允许执行查询语句.更新语句.DDL语句.返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果:返回值为fal ...
- namenode启动参数
namenode启动参数:-Xmx153600m -Xms153600m -Xmn4096m -verbose:gc -Xloggc:$LOG_DIR/namenode.gc.log -XX:Erro ...
- u-boot Makefile Source Test
一.概述 笔者已经写了一篇实现目标文件与源码分开的makefile测试实验,但是觉得不够完美,没有更多的体现u-boot Makefile的工作原理和特点.所以,决定重新修订,使之更加充分的接近u-b ...
- div+css知识点(2)
文字溢出 显示省略号的 关键的三句代码text-overflow:ellipsis; -o-text-overflow:ellipsis; overflow:hidden;文字缩进的代码是什么text ...
- 一个短路求值引起的一个小bug
今天在写一个判断字符串是否回文时因为短路求值问题导致了一个bug,记录如下: 代码如下 bool isPal(char str[],int len) { int begin=0; int end=le ...
- 【POJ2396】Budget(上下界网络流)
Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...