github.com/jmigpin/editor@v1.6.0/util/mathutil/geom.go (about) 1 package mathutil 2 3 import ( 4 "image" 5 6 "golang.org/x/image/math/fixed" 7 ) 8 9 // Integer based float. Based on fixed.Int52_12. 10 type Intf int64 11 12 func Intf1(x int) Intf { return Intf(x) << 12 } 13 func Intf2(x fixed.Int26_6) Intf { return Intf(x) << 6 } 14 15 func (x Intf) Floor() int { return int(x >> 12) } 16 func (x Intf) Ceil() int { return int((x + 0xfff) >> 12) } 17 18 func (x Intf) Mul(y Intf) Intf { 19 a := fixed.Int52_12(x) 20 b := fixed.Int52_12(y) 21 return Intf(a.Mul(b)) 22 } 23 24 func (x Intf) String() string { 25 return fixed.Int52_12(x).String() 26 } 27 28 //---------- 29 30 type PointIntf struct { 31 X, Y Intf 32 } 33 34 func PIntf1(x, y int) PointIntf { 35 x2 := Intf1(x) 36 y2 := Intf1(y) 37 return PointIntf{x2, y2} 38 } 39 func PIntf2(p image.Point) PointIntf { 40 return PIntf1(p.X, p.Y) 41 } 42 43 func (p PointIntf) Add(q PointIntf) PointIntf { 44 return PointIntf{p.X + q.X, p.Y + q.Y} 45 } 46 func (p PointIntf) Sub(q PointIntf) PointIntf { 47 return PointIntf{p.X - q.X, p.Y - q.Y} 48 } 49 50 func (p PointIntf) In(r RectangleIntf) bool { 51 return r.Min.X <= p.X && p.X < r.Max.X && r.Min.Y <= p.Y && p.Y < r.Max.Y 52 } 53 54 func (p PointIntf) ToPointCeil() image.Point { 55 return image.Point{p.X.Ceil(), p.Y.Ceil()} 56 } 57 func (p PointIntf) ToPointFloor() image.Point { 58 return image.Point{p.X.Floor(), p.Y.Floor()} 59 } 60 61 //---------- 62 63 type RectangleIntf struct { 64 Min, Max PointIntf 65 } 66 67 func RIntf(r image.Rectangle) RectangleIntf { 68 min := PIntf2(r.Min) 69 max := PIntf2(r.Max) 70 return RectangleIntf{min, max} 71 } 72 73 func (r RectangleIntf) Add(p PointIntf) RectangleIntf { 74 return RectangleIntf{r.Min.Add(p), r.Max.Add(p)} 75 } 76 func (r RectangleIntf) Sub(p PointIntf) RectangleIntf { 77 return RectangleIntf{r.Min.Sub(p), r.Max.Sub(p)} 78 } 79 80 func (r RectangleIntf) Intersect(s RectangleIntf) RectangleIntf { 81 if r.Min.X < s.Min.X { 82 r.Min.X = s.Min.X 83 } 84 if r.Min.Y < s.Min.Y { 85 r.Min.Y = s.Min.Y 86 } 87 if r.Max.X > s.Max.X { 88 r.Max.X = s.Max.X 89 } 90 if r.Max.Y > s.Max.Y { 91 r.Max.Y = s.Max.Y 92 } 93 if r.Empty() { 94 return RectangleIntf{} 95 } 96 return r 97 } 98 99 func (r RectangleIntf) Empty() bool { 100 return r.Min.X >= r.Max.X || r.Min.Y >= r.Max.Y 101 } 102 103 func (r RectangleIntf) ToRectFloorCeil() image.Rectangle { 104 min := r.Min.ToPointFloor() 105 max := r.Max.ToPointCeil() 106 return image.Rectangle{min, max} 107 }