package geojson

import (
	"github.com/tidwall/tile38/pkg/geojson/geo"
)

func SegmentIntersectsCircle(start, end, center Position, meters float64) bool {
	// These are faster checks.  If they succeed there's no need do complicate things.
	if center.DistanceTo(start) <= meters {
		return true
	}
	if center.DistanceTo(end) <= meters {
		return true
	}

	// Distance between start and end
	l := geo.DistanceTo(start.Y, start.X, end.Y, end.X)

	// Unit direction vector
	dx := (end.X - start.X) / l
	dy := (end.Y - start.Y) / l

	// Point of the line closest to the center
	t := dx * (center.X - start.X) + dy * (center.Y - start.Y)
	px := t * dx + start.X
	py := t * dy + start.Y
	if px < start.X || px > end.X || py < start.Y || py > end.Y {
		// closest point is outside the segment
		return false
	}

	// Distance from the closest point to the center
	return geo.DistanceTo(center.Y, center.X, py, px) <= meters
}