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练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
随机推荐
- (五)Struts2 标签
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 标签简介 Struts2 自己封装了一套标签,比JSTL ...
- 【转】Objective-C中的instancetype和id关键字
原文:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5 ...
- html-----005
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 原生与jqueryDOM
总结与复习原生与jquery的DOM操作. 获取元素节点: $(".class") $("#id") $(".class div") $(& ...
- Gtest打桩函数
假设Client的定义如下 class Client { ...... public: virtual bool GetData(std::string& data); ...... }; 我 ...
- HDU 5491 The Next
Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...
- Express使用html模板
express默认使用jade模板,可以配置让其支持使用ejs或html模板. 1. 安装ejs 在项目根目录安装ejs. npm install ejs 2.引入ejs var ejs = requ ...
- jquery插件-validate
1.引入js,css 下载地址:http://plugins.jquery.com/validate/ 2.设置验证规则:input的class添加以下验证属性 3.设置不符合规则的提示信息:添加da ...
- UVA 10763 Foreign Exchange
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description Your non- ...
- Quartz1.8.5例子(三)
/* * Copyright 2005 - 2009 Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the ...