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  }