poj 1269

题目概述

给定两条直线上各2个点,这4个点互不重合,问两条直线的位置关系是重合,平行,或相交,若相交则求出交点

时限

1000ms/3000ms

输入

第一行正整数times,其后times行,每行8个整数,分别代表第一条直线上两个点的坐标和第二条直线上两个点的坐标

限制

1<=times<=10;-1000<=坐标中的数字<=1000

输出

第一行为字符串INTERSECTING LINES OUTPUT,其后times行,每行一个字符串,若重合,为LINE,若平行,为NONE,若相交,为POINT,并输出一个空格以及两个保留两位小数的浮点数,为交点坐标,最后一行为字符串END OF OUTPUT

样例输入

8
0 0 4 4 0 4 4 0
5 0 7 6 1 0 2 3
5 0 7 6 3 -6 4 -3
2 0 2 27 1 5 18 5
0 3 4 0 1 2 2 5
0 1 0 2 1 0 2 0
0 0 0 1 1 0 1 1
0 0 1 0 0 1 1 1

样例输出

INTERSECTING LINES OUTPUT
POINT 2.00 2.00
NONE
LINE
POINT 2.00 5.00
POINT 1.07 2.20
POINT 0.00 0.00
NONE
NONE
END OF OUTPUT

讨论

计算几何,直线与直线位置关系,一开始以为是线段,直到第3组数据怎么也过不去才发现,然后删了一半行数
直线判断相交与线段不大同,第6组样例就是个例子,因而排除掉平行共线,也就是相交了,区分平行和共线只要随便找一个向量积,是0则共线,否则平行,至于求交点,找张纸写两个点斜式方程就能算出来,需要额外注意没有斜率时的处理

题解状态

172K,0MS,C++,1437B

题解代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f  
#define MAXN 103
#define memset0(a) memset(a,0,sizeof(a))
#define EPS 1e-6

inline int xp(int x1, int y1, int x2, int y2, int x3, int y3)
{
    return (x1 - x2)*(y3 - y2) - (y1 - y2)*(x3 - x2);
}
void point_of_intersection(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)//求交点 作为函数方便进行类型转换
{
    if (abs(x1 - x2) < EPS) {//第一条线铅直
        double k3 = (y4 - y3) / (x4 - x3);
        printf("%.2lf %.2lf\n", x1, k3*(x1 - x3) + y3);//output
    }
    else if (abs(x3 - x4) < EPS) {//第二条线铅直
        double k1 = (y2 - y1) / (x2 - x1);
        printf("%.2lf %.2lf\n", x3, k1*(x3 - x1) + y1);//output
    }
    else {
        double k1 = (y2 - y1) / (x2 - x1);
        double k3 = (y4 - y3) / (x4 - x3);
        printf("%.2lf %.2lf\n", (y3 - y1 + k1*x1 - k3*x3) / (k1 - k3), (k1*k3*(x3 - x1) + k3*y1 - k1*y3) / (k3 - k1));//output
    }
}
void fun()
{
    int x1, y1, x2, y2, x3, y3, x4, y4;
    scanf("%d%d%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);//input
    if ((y2 - y1)*(x4 - x3) == (y4 - y3)*(x2 - x1)) {//斜率相等
        if (!xp(x3, y3, x1, y1, x2, y2))//点3在第一条直线上
            printf("LINE\n");//output
        else//点3在第一条直线外
            printf("NONE\n");//output
    }
    else {//斜率不等
        printf("POINT ");//output
        point_of_intersection(x1, y1, x2, y2, x3, y3, x4, y4);
    }
}
int main(void)
{
    //freopen("vs_cin.txt", "r", stdin);
    //freopen("vs_cout.txt", "w", stdout);

    printf("INTERSECTING LINES OUTPUT\n");//output
    int times;
    scanf("%d", &times);//input
    while (times--)
        fun();
    printf("END OF OUTPUT\n");//output
}

EOF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值