package layout import ( "math" "github.com/stevec/fancywin/internal/config" ) type Rect struct{ Left, Top, Right, Bottom int32 } type Point struct{ X, Y int32 } func Resolve(work Rect, z config.Zone, gap int) Rect { w, h := float64(work.Right-work.Left), float64(work.Bottom-work.Top) r := Rect{ Left: work.Left + int32(math.Round(w*z.X/100)), Top: work.Top + int32(math.Round(h*z.Y/100)), Right: work.Left + int32(math.Round(w*(z.X+z.Width)/100)), Bottom: work.Top + int32(math.Round(h*(z.Y+z.Height)/100)), } g := int32(gap) r.Left += g r.Top += g r.Right -= g r.Bottom -= g if r.Right <= r.Left { r.Right = r.Left + 1 } if r.Bottom <= r.Top { r.Bottom = r.Top + 1 } return r } func Contains(r Rect, p Point) bool { return p.X >= r.Left && p.X < r.Right && p.Y >= r.Top && p.Y < r.Bottom } func ZoneAt(work Rect, zones []config.Zone, gap int, p Point) int { for i, z := range zones { if Contains(Resolve(work, z, gap), p) { return i } } return -1 } func Closest(work Rect, zones []config.Zone, p Point) int { best, bestD := -1, math.MaxFloat64 for i, z := range zones { r := Resolve(work, z, 0) cx, cy := float64(r.Left+r.Right)/2, float64(r.Top+r.Bottom)/2 dx, dy := float64(p.X)-cx, float64(p.Y)-cy if d := dx*dx + dy*dy; d < bestD { best, bestD = i, d } } return best }