- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
判断点是否在多边形内的种方法
判断点是否在多边形内(凸包和任意多边形分类讨论)
/*
POJ 1548:判断是否为凸包,判断点(圆是否在凸包内),其中判定点是否在多边形内是主要部分
Sample Input
5 1.5 1.5 2.0
1.0 1.0
2.0 2.0
1.75 2.0
1.0 3.0
0.0 2.0
5 1.5 1.5 2.0
1.0 1.0
2.0 2.0
1.75 2.5
1.0 3.0
0.0 2.0
1
Sample Output
HOLE IS ILL-FORMED
PEG WILL NOT FIT
*/
//法1、2:叉积判定、面积法判定(适用于凸包)。
#includeiostream
#includecstdio
#includecstring
#includestring
#includecmath
#includecstdlib
#includequeue
#includestack
#includemap
#includevector
#includealgorithm
using namespace std;
#define maxn 10005
#define eps 1e-8
#define max(x,y) (xy?x:y)
#define min(x,y) (xy?x:y)
int Fabs(double d) //重点:精度控制,如果d精度很高,如-0.00000000001即使是小于0,但也当做是0,关系到后面数据处理
{
if(fabs(d)eps) return 0;
else return d0?1:-1;
}
struct point
{
double x,y;
bool operator == (const point p)
{
return Fabs(x-p.x)==0Fabs(y-p.y)==0;
}
}p[maxn];
int n;
double pegx,pegy,pegr,max_x,max_y;
double x_multi(point p1,point p2,point p3)
{
return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
}
bool point_is_inside() //叉积判断点在凸包内部! 只针对于凸多边形。圆心连接每一条边的端点得到的叉积必须同向。 以此可以延伸出面积法判定点是否在凸包内部。这两种方法都局限于在凸多边形
{
point p1;
p1.x=pegx,p1.y=pegy;
int i,flag=1;
double tmp1=0.0,tmp2;
for(i=0;in;i++)
{
tmp2=Fabs(x_multi(p1,p[i],p[(i+1)%n]));
if(tmp1*tmp2-eps)
{
flag=0;
break;
}
tmp1=tmp2;
}
return flag;
}
double Len_ab(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
bool circle_is_inside() //判断圆是否在凸包内
{
if(pegr==0.0)
return true;
int i;
double ans;
point peg,t;
peg.x=pegx,peg.y=pegy;
for(i=0;in;i++) //判断圆心到多边形的每一条边的最短距离是否不小于半径
{
t=peg;
t.x+=p[i].y-p[(i+1)%n].y;
t.y+=p[(i+1)%n].x-p[i].x;
if(Fabs(x_multi(peg,t,p[i])*x_multi(peg,t,p[(i+1)%n]))==1) //如果垂足不在线段上则选择到线段两个端点距离较小的
ans=Fabs(Len_ab(peg,p[i])-Len_ab(peg,p[(i+1)%n]))==-1?Len_ab(peg,p[i]):Len_ab(peg,p[(i+1)%n]);
else
ans=fabs(x_multi(peg,p[(i+1)%n],p[i]))/Len_ab(p[i],p[(i+1)%n]); // 否则利用面积/底边得到最小距离
if(ans-pegr-eps)
return false;
}
return true;
}
int main()
{
int i,j;
w
您可能关注的文档
最近下载
- 神经源性膀胱评估和治疗方法.pptx VIP
- 万达广场购物中心商业氛围店铺一店一色设计必看指南.pdf VIP
- 2015届高考文综浙江省教育考试院测试样卷.doc VIP
- 马步冲拳(教案)-2021-2022学年体育一年级下册.docx
- 《压力管道元件制造许可规则》 压力管道元件制造许可规则.doc
- 非煤矿矿山企业基本情况登记表企业名称.doc VIP
- R410A安全技术说明书MSDS-china.PDF
- 人教A版高中数学必修第二册精品课件 第7章 复数 7.2.2 复数的乘、除运算.ppt VIP
- 2024年福建统招专升本《政治》知识考点汇总.pdf
- 新译林版英语八年级上册期中选择题精选含答案.doc VIP
文档评论(0)