double crush(vector2 s, vector2 p, vector2 center, int r) { // 이차 방정식 ax^2+bx+c=0 형태를 만든다 double a = p.dot(p); double b = 2*(s-center).dot(p); double c = center.dot(center)+s.dot(s)-r*r-2*center.dot(s); double d = b*b - 4*a*c; // 전혀 안부딪힘 if(d < 0) { return INFITY; } // 시간t의 근은 무조건 양수 2개가 나와야 된다(또는 양수 중근) // 그 중 작은 값만 취하기 때문에 큰 값은 버린다 double solv = (-b - sqrt(d)) / 2*a; // 음수가 하나라도 나오면 공은 장애물에 부딪히지 않는다 if(solv < 0) { return INFITY; } else { return solv; } }
double hitCircle(vector2 here, vector2 dir, vector2 center, double radius) { double a = dir.dot(dir); double b = 2 * dir.dot(here - center); double c = center.dot(center) + here.dot(here) - 2 * here.dot(center) - radius * radius; vector<double> sols = equation(a, b, c); if (sols.empty() || sols[0] < EPSILON) return INF; return sols[0]; }