| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
确实是道水题,我发个完整精确版的线段位置关系判定给大家留作模板吧struct point //定义点
{
double x;
double y;
};
typedef point vector; //引申为向量
vector operator -(vector a,vector b) //向量减法
{
point v;
v.x=a.x-b.x;
v.y=a.y-b.y;
return v;
}
bool zero(double x)
{
return fabs(x)<eps?true:false;
}
double fork_mul(vector a,vector b) //向量叉积
{
return (a.x*b.y-a.y*b.x);
}
double min(double x,double y)
{
return x<y?x:y;
}
double max(double x,double y)
{
return x>y?x:y;
}
int intersect_sign(point a,point b,point c,point d,point &result) //两线段位置关系的标志
{
double cba=fork_mul(b-c,a-c),dba=fork_mul(b-d,a-d),v12=fork_mul(b-a,d-c);
if(zero(v12)==true) //两线段方向相同
{
if(zero(cba)==true&&zero(dba)==true) //两线段共线
{
if(min(a.x,b.x)<max(c.x,d.x)&&min(c.x,d.x)<max(a.x,b.x)&&min(a.y,b.y)<max(c.y,d.y)&&min(c.y,d.y)<max(a.y,b.y))
return -3; //重叠共线
if(min(a.x,b.x)>max(c.x,d.x)||min(c.x,d.x)>max(a.x,b.x)||min(a.y,b.y)>max(c.y,d.y)||min(c.y,d.y)>max(a.y,b.y))
return -2; //分离共线
return -1; //首尾相接
}
else
return 0; //两线段平行
}
else //两线段方向不同,它们各自所在的直线相交
{
double bdc=fork_mul(d-b,c-b),adc=fork_mul(d-a,c-a);
result.x=(dba*c.x-cba*d.x)/(dba-cba); //求两线段所在直线的交点
result.y=(dba*c.y-cba*d.y)/(dba-cba);
if(dba*cba<=0&&bdc*adc<=0)
return 1; //线段相交
else
return 2; //线段不相交
}
}
注:若只判断线段是否相交,将标志对2取余即可,0为不相交,非0为相交
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator