module dkh.geo.circle;

import dkh.geo.primitive;

struct Circre2D(R) {
    Point2D!R p;
    R r;
    this(Point2D!R p, R r) {
        this.p = p;
        this.r = r;
    }
}

int crossSC(R)(Line2D!R l, Circre2D!R c) {
    R mi = distSP(l, c.p);
    if (sgn(mi - c.r) == 1) return 0;
    if (sgn(c.r - mi) == 0) return 1;
    int u = 0;
    if (sgn((l.x-c.p).abs - c.r) != -1) u++;
    if (sgn((l.y-c.p).abs - c.r) != -1) u++;
    return u;
}

unittest {
    EPS!double = 1e-6;
    alias P = Point2D!double;
    auto l = Line2D!double(P(0, 0), P(1, 0));
    auto c = Circre2D!double(P(3, 3), 1);
    assert(crossSC(l, c) == 0);
}