UVA 634 Polygon(模板题:判定点在多边形内)
题意:
给你一个n个顶点的多边形(所有点按时针顺序给出),然后再给你一个点p,问你这个点p是否在多边形内部?
分析:
直接用判定点是否在多边形内的模板即可. 模板参考刘汝佳书籍<<算法竞赛入门经典:训练指南>>P271.
模板最好是每个都自己手写,不要去直接复制粘贴哦,各种前辈的经验都说明反复的手写模板才是提高实力的正确方式.
AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const double eps=1e-10;
const int maxn=1000+10;
int dcmp(double x)
{
if(fabs(x)<eps) return 0;
return x<0?-1:1;
}
struct Point
{
double x,y;
Point(){}
Point(double x,double y):x(x),y(y){}
};
typedef Point Vector;
Vector operator-(Point A,Point B)
{
return Vector(A.x-B.x,A.y-B.y);
}
double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
}
double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
bool InSegment(Point P,Point A,Point B)
{
return dcmp( Cross(A-B,P-B) )==0 && dcmp( Dot(A-P,B-P) )<=0;
}
bool PointInPolygon(Point p,Point*poly,int n)
{
int wn=0;
for(int i=0;i<n;++i)
{
if(InSegment(p,poly[i],poly[(i+1)%n])) return true;
int k=dcmp( Cross(poly[(i+1)%n]-poly[i], p-poly[i] ) );
int d1=dcmp( poly[i].y-p.y );
int d2=dcmp( poly[(i+1)%n].y-p.y );
if(k>0 && d1<=0 && d2>0) wn++;
if(k<0 && d2<=0 && d1>0) wn--;
}
if(wn!=0) return true;
return false;
}
int main()
{
int n;
while(scanf("%d",&n)==1 && n)
{
Point poly[maxn],p;
for(int i=0;i<n;++i)
scanf("%lf%lf",&poly[i].x,&poly[i].y);
scanf("%lf%lf",&p.x,&p.y);
printf("%c\n",PointInPolygon(p,poly,n)?'T':'F');
}
return 0;
}
分享到:
相关推荐
用在多边形内创建n个随机点! 安装 npm install random-points-on-polygon 用法 randomPointsOnPolygon(数字,多边形,[属性],[fc]) 参量 number :Integer-生成的随机点数 polygon :Feature <(Polygon | ...
判点在凸多边形内,顶点按顺时针或逆时针给出,在多边形边上返回0
判断点是否在多边形内 #include #include #include #define max(a,b) ((a>b)?a:b) #define min(a,b) ((a)?a:b) using namespace std; const double INFINITY = 1e10; const double ESP = 1e-5; const int MAX_N ...
判断点是否在一个多边形区域内, 支持凸多边形与凹多边形(算法源于QT的QPolygonF)
多边形点内外判定,使用线性规划,每每两点求直线方程,采用第一个点作为符号判定点。
安装npm i polygon-centroid --save 用法centroid(points)返回点{x,y},它是给定点集(凸多边形)的重心。例子 var centroid = require ( 'polygon-centroid' ) ;var center = centroid ( this . polygon . points ...
多边形点确定点是否在多边形内部。 该模块基于从查询点投射半无限射线并计算交叉点。 如果您需要一个数值健壮的解决方案并愿意为此牺牲一些性能,请使用 。例子var pointInPolygon = require ( 'point-in-polygon' )...
二维多边形区域计算二维多边形的面积安装npm install 2d-polygon-area 用 var square = [[0, 0],[10, 0],[10, 10],[0, 10]].reverse();console.log(area(square));// outputs: 100执照
多边形合并:使用 multiPolygon, polygon 方法进行合并,具体合并可以参考文章如下:https://zhuhukang.blog.csdn.net/article/details/133716577
二维多边形包含多边形测试一个多边形是否完全包含另一个多边形这在计算多边形是洞还是岛时很有用。 这个库不是高度优化的,但应该适合您对一般情况的需求。 如果速度不够快,请联系我,我会看看我们能做些什么。安装...
多边形区域内的快速检测点。 据我所知,该代码比 MatLab File Exchange 上的所有 inpolygon 函数都快 [IN,ON,IN_strict] = InPolygon(px,py,cx,cy); 输入:px - nPM x nPN(矩阵)要测试的点的 X 坐标py - 要测试的...
C++版本判断点是否落入多边形内原理讲解及代码实现
本项目为vs工程项目,支持多点凹凸多边形进行三角划分,通过扫面线算法来进行三角划分,使用c++语言编写,直接打开即可运行。
多边形快船Flutter插件,可使用常规多边形形状(例如,五边形和六边形)创建视图。安装将此添加到包的pubspec.yaml文件中: dependencies : polygon_clipper : ^1.0.2用法使用ClipPolygon小部件 import 'package:...
多边形创建器在地图上创建多边形并导出为 WKT。 在申请。
利用Siverlight for arcgis实现polygon和polyline两种方式绘制多边形的小例子,源程序加debug文件
小库,用于多边形偏移(边距/填充)。 请参阅如何与一起使用的。 它可以很好地处理形状奇异且凹入的多边形。 我写这篇文章的原因是,我所知道的唯一解决此问题的方法是安格斯·约翰逊(Angus Johnson)的库。 库很...
确定点是否在多边形内的应用程序。
草坪多边形减少 获取输入多边形。 这与通过恒速收缩将该多边形缩小到一个点相同。 结果点是放置多边形标签以避免碰撞的最佳“中心”。
地理空间多边形索引基准用于计算基准当前,基准测试包括三个库:参数基准测试点和多边形相交,并且变化索引多边形的数量结果