MCPcopy
hub / github.com/tdewolff/canvas / intersectionRayCircle

Function intersectionRayCircle

path_intersection_util.go:799–816  ·  view source on GitHub ↗

https://mathworld.wolfram.com/Circle-LineIntersection.html

(l0, l1, c Point, r float64)

Source from the content-addressed store, hash-verified

797
798// https://mathworld.wolfram.com/Circle-LineIntersection.html
799func 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

Callers 2

JoinMethod · 0.85

Calls 4

NormMethod · 0.80
SubMethod · 0.80
PerpDotMethod · 0.80
AddMethod · 0.45

Tested by 1