题目概述
给定两条直线上各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", ×);//input
while (times--)
fun();
printf("END OF OUTPUT\n");//output
}
EOF