Intersecting Lines POJ 1269

题目大意:给出两条直线,每个直线上的两点,求这两条直线的位置关系:共线,平行,或相交,相交输出交点。

题目思路:主要在于求交点

F0(X)=a0x+b0y+c0==0;

F1(X)=a1x+b1y+c1==0;

设点(x0,y0)(x1,y1)过直线

解方程:a=y1-y0,b=x0-x1,c=x1y0-x0y1;

联立方程:

X=(b0c1-b1c0)/d;

Y=(a0c1-a1c0)/d;

d=a0b1-a1b0;

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<map>
#define INF 0x3f3f3f3f
#define MAX 100005
#define Temp 1000000000
#define MOD 1000000007

using namespace std;

int n;

int check(int x1,int y1,int x2,int y2,int x3,int y3)//叉积
{
    return (x3-x2)*(y3-y1)-(x3-x1)*(y3-y2);
}

void Point(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)
{
    int b0=x2-x1;
    int b1=x4-x3;
    int a0=y1-y2;
    int a1=y3-y4;
    int c0=x1*y2-x2*y1;
    int c1=x3*y4-x4*y3;
    int d=a0*b1-a1*b0;
    double X=(b0*c1-b1*c0*1.0)/d;
    double Y=(a1*c0-a0*c1*1.0)/d;
    printf("POINT %.2f %.2f
",X,Y);
}

void solve(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)
{
    if(check(x1,y1,x2,y2,x3,y3)==0 && check(x1,y1,x2,y2,x4,y4)==0)
        printf("LINE
");//共线
    else if((y2-y1)*(x3-x4) == (y3-y4)*(x2-x1))
        printf("NONE
");//平行
    else
        Point(x1,y1,x2,y2,x3,y3,x4,y4);
}

int main()
{
    int n,x1,y1,x2,y2,x3,y3,x4,y4;
    scanf("%d",&n);
    printf("INTERSECTING LINES OUTPUT
");
    for(int i=0; i<n; i++)
    {
        scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
        solve(x1,y1,x2,y2,x3,y3,x4,y4);
    }
    printf("END OF OUTPUT
");
    return 0;
View Code
原文地址:https://www.cnblogs.com/alan-W/p/5980350.html