计算几何-常用几何函数(模板)

浮点误差与精度问题

实数是用浮点数运算的,精度受到限制,特别是乘除法之后,误差比较大。此时>=<是可能出现误差的。我们可以认为非常接近0的实数都是0,写一个实数的三出口函数。

代码:

const double eps=1e-8;
int dcmp(double d)
{
    if(fabs(d)<eps) return 0;//fabs(x)返回实数x的绝对值
    return (d>0)? 1:-1;
}

叉积判断方向

p1×p2 = x1y2 - x2y1 = - p2×p1

若p1×p2为正,则相对于原点(0,0)来说,p2位于p1逆时针方向;若p1×p2为负,p2位于p1顺时针方向;若为0则方向相同,或相反。


判断点是否在线段上

如果想判断一个点是否在线段上,那么要满足以下两个条件:

(1)(Q - P1) * (P2 - P1)= 0;

(2)Q在以P1,P2为对角顶点的矩形内;


struct point  
{  
    double x;  
    double y;  
};  
  
bool onSegment(point Pi , point Pj , point Q)  
{  
    if((Q.x - Pi.x) * (Pj.y - Pi.y) == (Pj.x - Pi.x) * (Q.y - Pi.y)  //叉乘   
       //保证Q点坐标在pi,pj之间   
       && min(Pi.x , Pj.x) <= Q.x && Q.x <= max(Pi.x , Pj.x)      
       && min(Pi.y , Pj.y) <= Q.y && Q.y <= max(Pi.y , Pj.y))  
        return true;  
    else  
        return false;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值