hdu1086

/*
分析:
    15MS,和我估计的一样 - - III,因为对于斜率的计算,同一个斜率重复计算了好多次,可
以只算一次,然后用个表存下来,用的时候直接用就行了。
优化下下。
judge函数解释见下。


方法看起来挺麻烦的 - -III,谁有判断两线段是否相交的更好的方法,欢迎分享哈。
                                                              2012-04-12
*/




#include"stdio.h" 
int judge(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
double k1,k2;
double temp_y;
double temp_y_min,temp_y_max;
double t;
double x;


///第一条直线与x轴垂直。
if(x1-x2==0)
{
if(x3-x4==0)                        //判断第二条直线。
return 0;                       //若也与x轴垂直,则return 0(因为题目说了,两直线不重合,下面不再说了)。
temp_y=(y3-y4)/(x3-x4)*(x1-x3)+y3;  //否则计算是否有交点。
temp_y_min=y1;
temp_y_max=y2;
if(y1>y2)
{
t=temp_y_min;
temp_y_min=temp_y_max;
temp_y_max=t;
}
if(temp_y_min<=temp_y&&temp_y<=temp_y_max)
return 1;
else
return 0;
}


///第二条直线与x轴垂直。
if(x3-x4==0)
{
temp_y=(y1-y2)/(x1-x2)*(x3-x1)+y1;
temp_y_min=y3;
temp_y_max=y4;
if(y3>y4)
{
t=temp_y_min;
temp_y_min=temp_y_max;
temp_y_max=t;
}
if(temp_y_min<=temp_y&&temp_y<=temp_y_max)
return 1;
else
return 0;
}


///两条直线都不与x轴垂直,但是斜率相等,即平行,则return 0;
k1=(y1-y2)/(x1-x2);
k2=(y3-y4)/(x3-x4);
if(k1==k2)
return 0;


///两条直线既不与x轴垂直、又不平行,则判断交点是否在线段上。
x=(y1-y3+k2*x3-k1*x1)/(k2-k1);   //这个公式是推出来的,很好推:两个点斜式联立就行了。
if(x1<=x&&x<=x2&&x3<=x&&x<=x4)
return 1;
else
return 0;
}
int main()
{
int n;
double x1[111],y1[111],x2[111],y2[111];
double t;
int count;
int i,l;
while(scanf("%d",&n),n)
{
count=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x1[i],&y1[i],&x2[i],&y2[i]);
if(x1[i]>x2[i])
{
t=x1[i];
x1[i]=x2[i];
x2[i]=t;


t=y1[i];
y1[i]=y2[i];
y2[i]=t;
}
}


for(i=1;i<n;i++)
for(l=0;l<i;l++)
count+=judge(x1[i],y1[i],x2[i],y2[i],x1[l],y1[l],x2[l],y2[l]);


printf("%d\n",count);
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值