初学计算几何(三)——多边形的简单操作

前言

去学习了一下一些多边形相关的简单操作。

多边形

下面是一个多边形的基本定义:

struct Polygon//一个结构体用来存储一个多边形
{
    int n;Point p[10005];//n存储点数,P数组存储点
    Polygon() {n=0;}//构造函数
};

精度控制

在多边形问题中,我们需要好好控制精度:

#define eps 1e-10//设置eps减小精度误差
inline int dcmp(double x) {return fabs(x)<eps?0:(x>0?1:-1);}//判断正负

判断一个点是否在多边形内部

我们可以以该点向外引一条射线,如果与多边形边界相交奇数次,就说明该点在多边形内,否则就在多边形外。

特殊地,如果该点在多边形边上,我们可以返回\(-1\)

代码如下:

inline int IsInPolygon(Point A,Polygon P)//判断一个点是否在多边形内部
{
    register int i,flag=0,k,d1,d2;
    for(i=1;i<=P.n;++i)//枚举边
    {
        if(!dcmp(PToS(A,Segment(P.p[i],P.p[i%P.n+1])))) return -1;//如果点在边上,返回-1
        k=dcmp(Cro(P.p[i%P.n+1]-P.p[i],A-P.p[i])),d1=dcmp(P.p[i].y-A.y),d2=dcmp(P.p[i%P.n+1].y-A.y),
        k>0&&d1<=0&&d2>0&&++flag,k<0&&d1>0&&d2<=0&&--flag;//更新flag
    }
    return flag?1:0;//flag>0表示在多边形内部,否则说明在多边形外部
}

求多边形面积

求多边形面积,我们可以选一个点作为端点,然后枚举与它不相临的边,计算出该点与这些边所构成的三角形的面积和即可。

代码如下:

inline double PolygonArea(Polygon P)//求多边形面积
{
    register int i;register double res=0;//res统计和
    for(i=2;i<P.n;++i) res+=Cro(P.p[i]-P.p[1],P.p[i+1]-P.p[1])/2;//计算由1号节点,i号节点,i+1号节点构成的三角形面积
    return res;//返回答案
}

后记

关于多边形的内容貌似就这些?

如果还有的话我会继续进行补充的。

转载于:https://www.cnblogs.com/chenxiaoran666/p/Polygon.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值