注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

fudq's AC Road

何以解忧,唯有AC!

 
 
 

日志

 
 

求点到矩形的最短距离和最长距离  

2013-03-14 08:33:20|  分类: ACM-Steps |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
因为刚做了一道判断已知圆和已知矩形是否相交的题,于是就整理下 求点到矩形的最短距离和最长距离,注意此处给出的矩形必须满足长宽和x轴y轴平行的条件;
另外,函数里的(x1,y1)和(x2,y2)表示矩形内任一对角线的坐标。
思路:将矩形的四条边分别延长,于是将平面分成了9个部分,只需讨论下这9种情况即可。先将两个对角线坐标统一成左上和右下的坐标,然后分别讨论这9种情况。

double dismin,dismax;//记录点到矩形的最短距离和最长距离
double min(double a,double b){return a<b?a:b;}
double max(double a,double b){return a>b?a:b;}

double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

void fun(double x,double y,double x1,double y1,double x2,double y2)
{
//将对角线坐标统一成左上和右下
double temp;
if(x1 > x2)
{
temp=x1;
x1=x2;
x2=temp;
}
if(y2 > y1)
{
temp=y2;
y2=y1;
y1=temp;
}
//9种情况分别讨论
if(x<x1 && y>y1)
{
dismin=dis(x,y,x1,y1);
dismax=dis(x,y,x2,y2);
return ;
}
if((x<=x2 && x>=x1) && y>=y1)
{
dismin=y-y1;
dismax=max(dis(x,y,x1,y2),dis(x,y,x2,y2));
return ;
}
if(x>x2 && y>y1)
{
dismin=dis(x,y,x2,y1);
dismax=dis(x,y,x1,y2);
return ;
}
if(x>=x2 && (y<=y1 && y>=y2))
{
dismin=x-x2;
dismax=max(dis(x,y,x1,y1),dis(x,y,x1,y2));
return ;
}
if(x>x2 && y<y2)
{
dismin=dis(x,y,x2,y2);
dismax=dis(x,y,x1,y1);
return ;
}
if((x<=x2 && x>=x1) && y<=y2)
{
dismin=y2-y;
dismax=max(dis(x,y,x1,y1),dis(x,y,x2,y1));
return ;
}
if(x<x1 && y<y2)
{
dismin=dis(x,y,x1,y2);
dismax=dis(x,y,x2,y1);
return ;
}
if(x<=x1 && (y<=y1 && y>=y2))
{
dismin=x1-x;
dismax=max(dis(x,y,x2,y1),dis(x,y,x2,y2));
return ;
}
//点在矩形内
dismin=min(min(x-x1,x2-x),min(y1-y,y-y2));
dismax=max(max(dis(x,y,x1,y1),dis(x,y,x2,y1)),max(dis(x,y,x1,y2),dis(x,y,x2,y2)));
}



  评论这张
 
阅读(496)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018