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练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
随机推荐
- WCF 无法生成 client
在MVC中调用WCF 总是没有client 后来在网上查找原因,去掉Reuse type in referrenced assenbiles ,就可以生成代理代码.
- 生产者与消费者(一)---wait与notify
生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两类: (1)采用某种机 ...
- 去掉Visual Studio 编辑器里中文注释的红色波浪线 转载
我们通常用visual studio进行开发的时候,我们通常会用到一款比较流行比较方便的插件,那就是Visual Assist X,它可以增强Microsoft开发环境下的编辑能力,支持C/C++,C ...
- 从Bash漏洞学Shell脚本(冒号)
前天,爆发了Bash安全漏洞,非常恐怖.在网络上开始飞速传播,附带了非常友好的检测工具. $ env x='() { :;}; echo vulnerable' bash -c "echo ...
- 获取动态SQL查询语句返回值(sp_executesql)
在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Array with Object
如果你有一个数组,其中的元素各自代表不同东西,比如你有一个 QList<QString> strList; 其中strList[0]代表选手姓名,strList[1]代表选手家庭住址,很显 ...
- Gtest打桩函数
假设Client的定义如下 class Client { ...... public: virtual bool GetData(std::string& data); ...... }; 我 ...
- html5新增操作类名方式 classList
如果一个元素有多个类名,要如何删除呢,jqeury提供了removeClass()这个api,如果不用插件,自己封装,可以这样 function removeClass(elm,removeClass ...
- Cloudera Impala 之 ORDER BY without LIMIT currently not supported
ERROR: NotImplementedException: ORDER BY without LIMIT currently not supported impala中order by 需要l ...
- php多行字符串输出
$content_header =<<<CONTENT_HEADER <section class="content-header"> <h ...