poj 3335 半平面交求多边形的核,存在性判断

问给出的多边形中是否存在一点可以观察到整个多边形。 多边形核的判断,这里只需要判断存不存在,即使是一个点也可以.
题目是顺时针给出点的
 
   
#include < cmath >
#include
< stdio.h >
#include
< string .h >
#include
< algorithm >
#include
< iostream >
using namespace std;

typedef
double TYPE;
#define MaxPoint 110
#define Epsilon 1e-10 /*验证* // /精度的范围 ,根据不同的情况调整精度值
// 空间中的点,可以用来作为二维点来用
struct POINT { /* 验证 */
TYPE x; TYPE y; TYPE z;
POINT() : x(
0 ), y( 0 ), z( 0 ) {};
POINT(TYPE _x_, TYPE _y_, TYPE _z_
= 0 )
: x(_x_), y(_y_), z(_z_) {};
// 要用 G++ 提交 ,可以不用这个
POINT operator = ( const POINT & A){
x
= A.x;
y
= A.y;
z
= A.z;
}
};

// 多边形 ,逆时针或顺时针给出x,y
struct POLY { /* 验证 */
// n个点
int n;
// x,y为点的指针,首尾必须重合
TYPE * x;
TYPE
* y;
POLY() : n(
0 ), x(NULL), y(NULL) {};
POLY(
int _n_, const TYPE * _x_, const TYPE * _y_) {
n
= _n_;
x
= new TYPE[n + 1 ];
memcpy(x, _x_, n
* sizeof (TYPE));
x[n]
= _x_[ 0 ];
y
= new TYPE[n + 1 ];
memcpy(y, _y_, n
* sizeof (TYPE));
y[n]
= _y_[ 0 ];
}
};

// 判断 x 是正数还是负数
inline int Sign(TYPE x){ /* 验证 */
return x <- Epsilon ?- 1 :x > Epsilon;
}

void Interect(POINT x,POINT y,TYPE a,TYPE b,TYPE c, int & s,POINT q[]){
TYPE u
= fabs(a * x.x + b * x.y + c);
TYPE v
= fabs(a * y.x + b * y.y + c);
q[
++ s].x = (x.x * v + y.x * u) / (u + v);
q[s].y
= (x.y * v + y.y * u) / (u + v);
}
// 利用半平面切割
void Cut(TYPE a,TYPE b,TYPE c, int & KarnalPoint,POINT p[])
{
int s = 0 ;
int i;
POINT q[MaxPoint];
for (i = 1 ; i <= KarnalPoint; i ++ ){ // 遍历所有顶点是否能观察到该边

if (Sign(a * p[i].x + b * p[i].y + c) >= 0 ){ // 因为线段是顺时针给出的,如果是逆时针就是<=0

q[
++ s] = p[i]; // 若是则存储
}
else {

if (Sign(a * p[i - 1 ].x + b * p[i - 1 ].y + c) > 0 ) // 逆时针就是<0
Interect(p[i - 1 ], p[i], a, b, c, s, q);

if (Sign(a * p[i + 1 ].x + b * p[i + 1 ].y + c) > 0 ) // 逆时针就是<0
Interect(p[i + 1 ], p[i], a, b, c, s, q);
}
}
// 最后的p数组存放半平面的点集合
for (i = 1 ;i <= s;i ++ )
p[i]
= q[i];
p[s
+ 1 ] = p[ 1 ],p[ 0 ] = p[s];
KarnalPoint
= s;
}

POLY PolygonKernal(
int n, POINT point[])
{
int KarnalPoint = n;
POINT p[MaxPoint];
// p 的大小和 tr 的大小一样
for ( int i = 0 ; i < n; i ++ ){
p[i
+ 1 ] = point[i]; // 初始化边界
}
point[n]
= point[ 0 ];
p[n
+ 1 ] = p[ 1 ];
p[
0 ] = p[n];

TYPE a,b,c;
for ( int i = 0 ;i < n;i ++ ){
a
= point[i + 1 ].y - point[i].y ; // 计算出相邻两点所在直线ax+by+c=0
b = point[i].x - point[i + 1 ].x;
c
= point[i + 1 ].x * point[i].y - point[i].x * point[i + 1 ].y;
Cut(a, b, c, KarnalPoint, p);
}

TYPE X[MaxPoint],Y[MaxPoint];
for ( int i = 0 ; i < KarnalPoint; i ++ ){
X[i]
= p[i].x;
Y[i]
= p[i].y;
}
POLY poly(KarnalPoint, X, Y);

return poly;
}
int main(){
int n,t;
POINT point[MaxPoint];

scanf(
" %d " , & t);
while (t -- )
{
scanf(
" %d " , & n);
for ( int i = 0 ;i < n;i ++ ){
scanf(
" %lf%lf " , & point[i].x, & point[i].y);
}
POLY poly
= PolygonKernal(n, point);
if (poly.n == 0 ) puts( " NO " ); // 这里如果有一个点,或者一条线段都可以,所以判断poly.n是不是等于0就行了,不用判断面积
else puts( " YES " );
}
return 0 ;
}

转载于:https://www.cnblogs.com/laipDIDI/articles/2041875.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值