欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Intersecting Lines POJ - 1269

程序员文章站 2022-04-02 17:02:08
...

Intersecting Lines POJ - 1269
题意:给出两条直线上的两点求两直线的交点。
思路:
一般方程法:
直线的一般方程为F(x) = ax + by + c = 0。既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0。
因此我们可以将两条直线分别表示为
F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0
那么两条直线的交点应该满足
a0*x + b0*y +c0 = a1*x + b1*y + c1
由此可推出
x = (b0*c1 – b1*c0)/D
y = (a1*c0 – a0*c1)/D
D = a0*b1 – a1*b0, (D为0时,表示两直线平行或者重合)
判断重合用叉积表示。

讲解求两直线交点

//求两直线的交点
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double e=1e-8;
struct  point
{
    double x,y;
};
struct v{
    point start;
    point end;
    v(){}
    v(point _start,point _end){
        start=_start;end=_end;
    }
};
double cross(v v1,v v2)//判断
{
    double result=0;
    v1.end.x=v1.end.x-v1.start.x;
    v1.end.y=v1.end.y-v1.start.y;
    v1.start.x=v1.start.y=0;
    v2.end.x=v2.end.x-v2.start.x;
    v2.end.y=v2.end.y-v2.start.y;
    v2.start.x=v2.start.y=0;
    result=v1.end.x*v2.end.y-v2.end.x*v1.end.y;
    return result;
}
int main()
{
    int T;point p1,p2,p3,p4;
    scanf("%d",&T);
    printf("INTERSECTING LINES OUTPUT\n");
    while(T--)
    {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y,&p4.x,&p4.y);
        double a0,b0,c0,a1,b1,c1;
        a0=p1.y-p2.y,b0=p2.x-p1.x,c0=p1.x*p2.y-p2.x*p1.y;
        a1=p3.y-p4.y,b1=p4.x-p3.x,c1=p3.x*p4.y-p4.x*p3.y;
        double D=a0*b1-a1*b0;
        if(fabs(D)<e)
        {
            if(fabs(cross(v(p1,p3),v(p1,p2)))<e) printf("LINE\n");
            else printf("NONE\n");
        }
        else
        {
            double x=(b0*c1-b1*c0)/D;
            double y=(a1*c0-a0*c1)/D;
            printf("POINT %.2f %.2f\n",x,y);//输出%.2lf与%.2f的区别?输出不用lf
    }
    printf("END OF OUTPUT\n");
    return 0;
}