浮点误差与精度问题
实数是用浮点数运算的,精度受到限制,特别是乘除法之后,误差比较大。此时>=<是可能出现误差的。我们可以认为非常接近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;
}