题意就是, 给你8个点, (x1, y1),( x2, y2), (x3, y3), (x4, y4);
判断这两个直线相交, 平行, 还是重合, 相交输出交点, 平行输出NONE, 重合是LINE;
设直线PQ, 他的方向向量是w = (p0 - q0), 直线上一点是p0,则直线 可 表示为 PQ = p0 + vw* t;若是直线t为0;
设直线MN,同上, MN = m0 + v * t
设向量u = p0 - m0;
tt = Cross(w, u )/ Cross(v, u);
则交点就是 p0.x + v.x * tt, p0.y + v.y * tt;
证明略
code
#include <cstdio> #include <cmath> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 double x1, xy1, x2, y2, x3, y3, x4, y4; void judge(); int Cross(double x,double y,double xx1,double yy1,double xx2,double yy2); bool parallel(); //判断是否平行 void IntersectionSection();//判断是否相交 和 计算交点 int main() { int n; cin >> n; printf("INTERSECTING LINES OUTPUT\n"); while(n--) { cin >> x1 >> xy1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4; judge(); }printf("END OF OUTPUT\n"); return 0; } void judge() { if((x1 == x2 && x2 == x3 && x3 == x4 ) || (xy1 == y2 && y2 == y3 && y3== y4)) { printf("LINE\n"); return ; } if((x1==x2 && x3==x4) || (xy1==y2 && y3 == y4)) { printf("NONE\n"); return ; } if( parallel() ) { if(!Cross(x1, xy1, x3, y3, x4, y4)) printf("LINE\n"); else printf("NONE\n"); return; } IntersectionSection(); } bool parallel() { double px = x2 - x1, py = y2 - xy1, qx = x4 - x3, qy = y4 - y3; // printf("paralle %lf %lf\n", py/px, qy/qx); if(fabs((py/px) - (qy/qx)) < eps) return true; return false; } int Cross(double x,double y,double xx1,double yy1,double xx2,double yy2) { //printf("%d %d %d %d %d %d\n", A.x, A.y, B.x1, B.y1, B.x2, B.y2); double Px = x - xx1,Py = y - yy1, Qx = xx2 - xx1, Qy = yy2 - yy1; //printf("Cross%f %f %f %f %f\n",Px, Py, Qx, Qy, Px*Qy - Qx*Py); return Px*Qy - Qx*Py; //<0, left, >0 right } void IntersectionSection() { /*if(Cross(x1, xy1, x3, y3, x4, y4) * Cross(x2, y2, x3, y3, x4, y4) >= eps || Cross(x3, y3, x1, xy1, x2, y2) * Cross(x4, y4, x1, xy1, x2, y2) >= eps) { printf("###NONE\n"); return; }*/ double px = x1, py = xy1, vx = x2 - x1, vy = y2 - xy1, qx = x3, qy = y3, wx = x4 - x3, wy = y4 - y3, ux = px - qx, uy = py - qy, t; t = (wx*uy - ux*wy)/(vx*wy - wx*vy); printf("POINT %.2f %.2f\n", px + t*vx, py+t*vy); }