请问各位高手,if(a[i]*b[j]-a[j]*b[i]!=0) 在如下程序中,是什么限制条件,起什么作用呢?
(一)问题2001年第10期擂台赛的问题是: 给定n条线段,请编一程序,给出所有的交点坐标。
(二)一般解法该问题的解决并不难: 遍历该组线段中的任意一对求出交点即可。具体两线段交点的求法为:(1)先对应两线段分别对它们所在的直线写出相应的两点式方程,即设一线段两端点坐标分别为(xi,yi)与(xj,yj),则对应直线方程为: (y-yi)/(x-xi)=(y-yj)/(x-xj);(2)求两直线交点坐标,即联合两直线方程得一个一元二次方程组,求解之;(3)如方程组有解,判断解是否在两线段的两端点之间或端点上。是则方程组之解即是两线段的交点;否则两线段无交点。当然,在求两线段交点前还可以用一些条件式加以过滤,如对两线段所对应矩形无相交部分的情况,可直接判断两线段无交点等等。
(三)编程实例参赛程序有许多采用了上述方法,这里选载一个比较典型的程序设计
/* 程序说明
程序中的几个变量:
*x1棗线段初始点横坐标*y1棗线段初始点纵坐标
*x2棗线段终止点横坐标*y2棗线段终止点纵坐标
*a棗线段所在直线解析式中x项系数*b棗线段所在直线解析式中y项系数
*c棗线段所在直线解析式中常数项jx棗两条线段所在直线交点横坐标
jy棗两条线段所在直线交点纵坐标程序结构:
读出变量, 分配内存。用解析几何中计算两直线交点的公式两两计算两条线段所在直线交点。
用函数between判断两条线段所在直线交点是否
在线段上,若是,则输出结果。*/
#include <stdio.h>
#include <stdlib.h>
// 此函数判断交点坐标是否在线段坐标范围内,即判断交点是否落在线段上
int between(float u, float v, float w)
{ float max,min;
max=(v>w)?v:w;
min=(v<w)?v:w;
return ((u<=max&&u>=min)?1:0);
}
int main()
{
int n,i,j,num; //n为线段条数
float x1[100],y1[100],x2[100],y2[100],a[100],b[100],c[100],jx,jy;
while(scanf("%d",&n)&&n!=0)
{
num=0;
for(i=0;i<n;++i)
{ scanf("%f%f%f%f",&x1[i],&y1[i],&x2[i],&y2[i]);
if(x1[i]==x2[i])
{
a[i]=1;b[i]=0;c[i]=-x1[i];
}
else
{
a[i]=(y2[i]-y1[i])/(x1[i]-x2[i]);b[i]=1;
c[i]=(x1[i]*y2[i]-x2[i]*y1[i])/(x2[i]-x1[i]);
}
}
for(i=0;i<n;++i)
{
for(j=i+1;j<n;++j)
{
if(a[i]*b[j]-a[j]*b[i]!=0)
{
jx=(b[i]*c[j]-b[j]*c[i])/(a[i]*b[j]-a[j]*b[i]);
jy=(c[i]*a[j]-c[j]*a[i])/(a[i]*b[j]-a[j]*b[i]);
if(between(jx,x1[i],x2[i])&&between(jx,x1[j],x2[j])&&between(jy,y1[i],y2[i])&&between(jy,y1[j],y2[j]))
//printf("(%f,%f)\n ",jx,jy);
num++;
}
}
}
printf("%d\n",num);
}
return 0;
}