23 double A = line->y2 - line->y1;
24 double B = line->x1 - line->x2;
25 double C = line->x2 * line->y1 - line->x1 * line->y2;
29 if (
Math::fabs(circle->y - (-C / B)) <= circle->r) {
30 if (
Math::min(line->x1, line->x2) <= circle->x && circle->x <=
Math::max(line->x1, line->x2)) {
33 return {
true,
Vector(0, circle->y - (-C / B)).getNormal(), circle, line};
35 return {
true,
Vector(0, circle->y - (-C / B)).getNormal(), line, circle};
42 if (
Math::fabs(circle->x - (-C / A)) <= circle->r) {
43 if (
Math::min(line->y1, line->x2) <= circle->y && circle->y <=
Math::max(line->y1, line->y2)) {
46 return {
true,
Vector(circle->x - (-C / A), 0).getNormal(), circle, line};
48 return {
true,
Vector(circle->x - (-C / A), 0).getNormal(), line, circle};
53 float D = C / B - circle->y;
54 float a = 1 + A*A / (B * B);
55 float b = -2 * circle->x + 2 * A * D / B;
56 float c = circle->x * circle->x + D * D - circle->r * circle->r;
58 float discriminant = b * b - 4 * a * c;
59 if (discriminant >= 0) {
61 float sqrtDiscriminant =
Math::sqrt(discriminant);
62 float x1 = (-b + sqrtDiscriminant) / (2 * a);
63 float x2 = (-b - sqrtDiscriminant) / (2 * a);
64 float y1 = -A/B * x1 - C/B;
65 float y2 = -A/B * x2 - C/B;
73 return {
true,
Vector(circle->x - (x1 + x2) / 2, circle->y - (y1 + y2) / 2).getNormal(), circle, line};
75 return {
true,
Vector(circle->x - (x1 + x2) / 2, circle->y - (y1 + y2) / 2).getNormal(), line, circle};