poj 1269 判断直线的位置关系

题目链接

题意

判断两条直线的位置关系,重合/平行/相交(求交点)。

直线以其上两点的形式给出(点坐标为整点)。

思路

写出直线的一般式方程(用\(gcd\)化为最简),

计算\(\begin{vmatrix}a1&b1\\a2&b2\end{vmatrix}\),

  1. 若不为\(0\),则两直线有交点,$$x=\frac{\begin{vmatrix}-c1&b1\-c2&b2\end{vmatrix}}{\begin{vmatrix}a1&b1\a2&b2\end{vmatrix}},y=\frac{\begin{vmatrix}a1&-c1\a2&-c2\end{vmatrix}}{\begin{vmatrix}a1&b1\a2&b2\end{vmatrix}}$$

  2. 若为\(0\),若\(c1==c2\),则共线,否则平行。

Code

#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
struct Line {
    int a, b, c;
    Line(int _a=0, int _b=0, int _c=0) : a(_a), b(_b), c(_c) {}
};
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int abs(int x) { return x > 0 ? x : -x; }
Line make_line(int x1, int y1, int x2, int y2) {
    if (x1 == x2) return Line(1, 0, -x1);
    if (y1 == y2) return Line(0, 1, -y1);
    int div = gcd(abs(x2-x1), abs(y2-y1));
    int b = (x2-x1) / div, a = (y1-y2) / div;
    if (a < 0) a = -a, b = -b;
    int c = -a * x1 - b * y1;
    return Line(a, b, c);
}
void work() {
    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);
    Line l1 = make_line(x1, y1, x2, y2), l2 = make_line(x3, y3, x4, y4);
    int det = l1.a * l2.b - l2.a * l1.b;
    if (det) {
        int dx = l2.c * l1.b - l1.c * l2.b,
            dy = l2.a * l1.c - l1.a * l2.c;
        printf("POINT %.2f %.2f\n", 1.0*dx/det, 1.0*dy/det);
    }
    else {
        if (l1.c == l2.c) printf("LINE\n");
        else printf("NONE\n");
    }
}
int main() {
    printf("INTERSECTING LINES OUTPUT\n");
    int n;
    scanf("%d", &n);
    while (n--) work();
    printf("END OF OUTPUT\n");
    return 0;
}

posted @ 2017-10-07 10:20  救命怀  阅读(176)  评论(0编辑  收藏  举报