Example #1
1
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;
    }
}
Example #2
0
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];
}