<一>点的基本运算
// 返回两点之间欧氏距离
double dist(POINT p1,POINT p2)
{
return( sqrt( (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ) );
}
// 判断两个点是否重合
bool equal_point(POINT p1,POINT p2)
{
return ( (abs(p1.x-p2.x)<EP)&&(abs(p1.y-p2.y)<EP) );
}
/*(sp-op)*(ep-op)的叉积
r=multiply(sp,ep,op),得到(sp-op)*(ep-op)的叉积
r>0:sp 在矢量 op ep 的顺时针方向;
r=0:op sp ep 三点共线;
r<0: sp 在矢量 op ep 的逆时针方向 */
double multiply(POINT sp,POINT ep,POINT op)
{
return((sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y));
}
double amultiply(POINT sp,POINT ep,POINT op)
{
return fabs((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}
/*矢量(p1-op)和(p2-op)的点积
r=dotmultiply(p1,p2,op),得到矢量(p1-op)和(p2-op)的点积如果两个矢量都非零矢量
r < 0: 两矢量夹角为锐角;
r = 0:两矢量夹角为直角;
r > 0: 两矢量夹角为钝角 */
double dotmultiply(POINT p1,POINT p2,POINT p0)
{
return ((p1.x-p0.x)*(p2.x-p0.x) + (p1.y-p0.y)*(p2.y-p0.y));
}
/* 判断点 p 是否在线段 l 上
条件:(p 在线段 l 所在的直线上)&& (点 p 在以线段 l 为对角线的矩形内) */
bool online(LINESEG l,POINT p)
{
return ((multiply(l.e,p,l.s)==0)
&& ( ( (p.x-l.s.x) * (p.x-l.e.x) <=0 ) && ( (p.y-l.s.y)*(p.y-l.e.y) <=0 ) ) );
}
// 返回点 p 以点 o 为圆心逆时针旋转 alpha(单位:弧度)后所在的位置
POINT rotate(POINT o,double alpha,POINT p)
{
评论2