Skip to content

Line

C++

struct Line {
    // a*x + b*y + c = 0
    long long a;
    long long b;
    long long c;

    Line(long long a, long long b, long long c) {
        long long g = std::gcd(a, std::gcd(b, c));
        a /= g;
        b /= g;
        c /= g;

        if (a < 0) {
            a *= -1;
            b *= -1;
            c *= -1;
        } else if (a == 0 and b < 0) {
            b *= -1;
            c *= -1;
        }
        this->a = a;
        this->b = b;
        this->c = c;
    }

    static Line from_point(long long x1, long long y1, long long x2, long long y2) {
        // assume (x1, y1) != (x2, y2)
        long long dx = x1 - x2, dy = y1 - y2;
        return Line(dy, -dx, dx * y1 - dy * x1);
    }

    bool operator==(const Line &other) {
        return a == other.a and b == other.b and c == other.c;
    }
};

inline bool operator<(const Line &lhs, const Line &rhs) {
    if (lhs.a != rhs.a)
        return lhs.a < rhs.a;
    if (lhs.b != rhs.b)
        return lhs.b < rhs.b;
    if (lhs.c != rhs.c)
        return lhs.c < rhs.c;
    return false;
}

Example

ARC 173 B - Make Many Triangles (C++)