设读入的四个点分别为A, B, C, D。
首先,算出矢量AB和CD,如果它们的叉积为0,则说明它们的方向是相同或相反的,也就是这两条直线的斜率相等。
若斜率相等,则要进一步判断它们是否为同一条直线,那只需要判断点C是否在直线AB上,如果矢量CA和矢量AB的叉积为0,则说明它们的方向是相同或相反的,那么点C就在直线AB上。
若斜率不相等,则要求交点。如图,C’D’平行CD,v、w、u是三个矢量,E是交点。问题变成:将矢量v“延长”多少倍以后,能变成矢量AE(然后求出新的矢量后加上点A的坐标即可)?通过图形容易得出,其实就是橙色的平行四边形的面积是紫色平行四边形面积的多少倍,这个可以用叉积轻松求出。当然,这只是其中一种可能,其他的也差不多也是这样。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-8;
struct Point {
double x, y;
Point() {}
Point(double a, double b): x(a), y(b) {}
inline void Scan() {scanf("%lf%lf", &x, &y);}
};
typedef Point Vector;
inline bool zero(double x) {return abs(x) < eps;}
inline double operator * (Vector a, Vector b) {return a.x * b.y - a.y * b.x;}
inline Vector operator + (Vector a, Vector b) {return Vector(a.x + b.x, a.y + b.y);}
inline Vector operator - (Vector a, Vector b) {return Vector(a.x - b.x, a.y - b.y);}
inline Vector operator * (Vector a, double b) {return Vector(a.x * b, a.y * b);}
int main() {
printf("INTERSECTING LINES OUTPUT\n");
int T;
scanf("%d\n", &T);
for (; T; T --) {
Point a, b, c, d;
a.Scan(), b.Scan(), c.Scan(), d.Scan();
scanf("\n");
Vector v = b - a, w = d - c;
if (zero(v * w))
if (zero(v * (b - c)))
printf("LINE\n");
else
printf("NONE\n");
else {
Point res = a + v * ((w * (a - c)) / (v * w));
printf("POINT %.2lf %.2lf\n", res.x, res.y);
}
}
printf("END OF OUTPUT\n");
return 0;
}