求两直线的交点,有交点输出交点。没有输出是平行还是同一条直线。。
求两直线的交点
语法:result=mindistance(Point p1,Point p2,Point q);
参数:
p1~p4:
直线上不相同的两点
*p:
通过指针返回结果
返回值:
1:两直线相交;2:两直线平行
注意:
如需要判断两线段交点,检验k和对应k1(注释中)的值是否在0~1之间,用在0~1之间的那个求交点
源程序:
A = fun(s1,e1);//求A,B直线的交点。
B = fun(s2,e2);
void IsPoint(Lin A,Lin B)
{
if(fabs(A.a)<eps)
A.a = 0;
if(fabs(A.b)<eps)
A.b = 0;
if(fabs(A.c)<eps)
A.c = 0;
if(fabs(B.a)<eps)
B.a = 0;
if(fabs(B.b)<eps)
B.b = 0;
if(fabs(B.c)<eps)
B.c = 0;
if(A.a*A.b*B.a*B.b == 0)
{
if(fabs(A.a)+fabs(B.a)<eps)
{
if(fabs((A.c+0.0)/A.b-(B.c+0.0)/B.b)<eps)
printf("LINE\n");
else
printf("NONE\n");
}
else if(fabs(A.b)+fabs(B.b)<eps)
{
if(fabs(A.c/A.a - B.c/B.a)<eps)
printf("LINE\n");
else
printf("NONE\n");
}
else
{
if(fabs(A.a*A.b)<eps)
{
if(fabs(A.a)<eps)
{
yy = -A.c / A.b;
xx = -(B.c+B.b*yy)/B.a;
}
else
{
xx = -A.c/A.a;
yy = -(B.c+B.a*xx)/B.b;
}
}
else
{
if(fabs(B.a)<eps)
{
yy = -B.c / B.b;
xx = -(A.c+A.b*yy)/A.a;
}
else
{
xx = -B.c/B.a;
yy = -(A.c+A.a*xx)/A.b;
}
}
printf("POINT %.2f %.2f\n",xx,yy);
}
}
else if(fabs(A.b/A.a-B.b/B.a)<eps)
{
if(fabs((A.c+0.0)/A.a - (B.c+0.0)/B.a)<eps)
printf("LINE\n");
else
printf("NONE\n");
}
else
{
yy = (A.a*B.c-B.a*A.c+0.0)/(A.b*B.a-B.b*A.a);
xx = -(A.c + A.b * yy)/A.a;
printf("POINT %.2f %.2f\n",xx,yy);
}
}
//该模板未被程序验证
求两直线的交点
语法:result=mindistance(Point p1,Point p2,Point q);
参数:
p1~p4:
直线上不相同的两点
*p:
通过指针返回结果
返回值:
1:两直线相交;2:两直线平行
注意:
如需要判断两线段交点,检验k和对应k1(注释中)的值是否在0~1之间,用在0~1之间的那个求交点
源程序:
typedef struct {
double x,y;
} Point;
int linecorss(Point p1,Point p2,Point p3,Point p4,Point *p)
{
double k;
//同一直线
if ((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x)==0&&
(p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x)==0) return 2;
//平行,不同一直线
if ((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y)==0) return 0;
k=((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y));
//k1=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y));
(*p).x=p1.x+k*(p2.x-p1.x);
(*p).y=p1.y+k*(p2.y-p1.y);
return 1;//有交点}