acwing-4564 相交线

众所周知,平面上不重复的两个点可以确定一条直线,并且平面上的两条直线的相交关系将会是以下三种之一:

不相交,因为它们相互平行。
相交于一条线,因为它们是同一条直线。
相交于一点。
现在,给定两条直线,请你判断它们的相交关系以及相交位置。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含 8 个整数 x1,y1,x2,y2,x3,y3,x4,y4,其中点 (x1,y1) 和点 (x2,y2) 在第一条直线上,保证此两点不同;点 (x3,y3) 和点 (x4,y4) 在第二条直线上,保证此两点不同。

输出格式
输出 T+2 行。
第一行输出 
INTERSECTING LINES OUTPUT。

接下来 T 行,每行输出一组数据的结果,首先输出相交关系 NONE(不相交)或 LINE(共线)或 POINT(相交于一点),然后如果相交关系为 POINT,则还需输出相交点的坐标,保留两位小数。

最后一行输出 END OF OUTPUT。

数据范围
1≤T≤10,
−1000≤xi,yi≤1000

思路:

首先通过两直线方向向量叉积判断是否平行,若平行则再求叉积判断是否共线,若不平行通过公式求出交点

代码:

#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
const double DINF = 1e18, eps = 1e-8;
struct point {
	double x, y;
	point(double x = 0, double y = 0) : x(x), y(y) {}
};
typedef point Vector;
int n, m;
Vector operator + (Vector A, Vector B) {return Vector(A.x + B.x, A.y + B.y);}
Vector operator - (Vector A, Vector B) {return Vector(A.x - B.x, A.y - B.y);}
Vector operator * (Vector A, double p) {return Vector(A.x * p, A.y * p);}
Vector operator / (Vector A, double p) {return Vector(A.x / p, A.y / p);}
int sgn(double x) {
	if (fabs(x) < eps) return 0;
	if (x < 0) return -1;
	return 1;
}
bool operator < (const point &a, const point &b) {return sgn(a.x - b.x) < 0 || sgn(a.x - b.x) == 0 && sgn(a.y - b.y) < 0;} 
double dot(Vector A, Vector B) {return A.x * B.x + A.y * B.y;}
double cross(Vector A, Vector B) {return A.x * B.y - A.y * B.x;}
int relation (point A, point B, point C) {
	int c = sgn(cross((B - A), (C - A)));
	if (c < 0) return 1;
	else if (c > 0) return -1;
	return 0;
}
point intersection(point a, Vector p, point b, Vector q) {
	Vector s = a - b;
	double c = cross(q, s) / cross(p, q);
	return point (a.x + c * p.x, a.y + c * p.y);
}
int main () {
	int t;
	cin >> t;
	cout << "INTERSECTING LINES OUTPUT" << endl;
	while (t--) {
		int x1, y1, x2, y2, x3, y3, x4, y4;
		cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
		point a(x1, y1), b(x2, y2), c(x3, y3), d(x4, y4);
		if (fabs(cross(a - b, c - d)) < eps)  {
			if (fabs(cross(a - b, a - c)) < eps) puts("LINE");
			else puts("NONE");
		}
		else {
			point ans = intersection(a, a - b, c, c - d);
			printf ("POINT %.2lf %.2lf\n", ans.x, ans.y); 
		}
	}
	puts("END OF OUTPUT\n");
}

用的是dalao繁凡さん的计算几何板子

posted @ 2022-08-11 11:59  misasteria  阅读(36)  评论(0编辑  收藏  举报