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;
}

转载于:https://www.cnblogs.com/kkkkahlua/p/7634238.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值