https://mathworld.wolfram.com/Circle-LineIntersection.html
(l0, l1, c Point, r float64)
| 797 | |
| 798 | // https://mathworld.wolfram.com/Circle-LineIntersection.html |
| 799 | func intersectionRayCircle(l0, l1, c Point, r float64) (Point, Point, bool) { |
| 800 | d := l1.Sub(l0).Norm(1.0) // along line direction, anchored in l0, its length is 1 |
| 801 | D := l0.Sub(c).PerpDot(d) |
| 802 | discriminant := r*r - D*D |
| 803 | if discriminant < 0 { |
| 804 | return Point{}, Point{}, false |
| 805 | } |
| 806 | discriminant = math.Sqrt(discriminant) |
| 807 | |
| 808 | ax := D * d.Y |
| 809 | bx := d.X * discriminant |
| 810 | if d.Y < 0.0 { |
| 811 | bx = -bx |
| 812 | } |
| 813 | ay := -D * d.X |
| 814 | by := math.Abs(d.Y) * discriminant |
| 815 | return c.Add(Point{ax + bx, ay + by}), c.Add(Point{ax - bx, ay - by}), true |
| 816 | } |
| 817 | |
| 818 | // https://math.stackexchange.com/questions/256100/how-can-i-find-the-points-at-which-two-circles-intersect |
| 819 | // https://gist.github.com/jupdike/bfe5eb23d1c395d8a0a1a4ddd94882ac |