geom/rectanglef32.go

91 lines
2.5 KiB
Go

package geom
// RectangleF32 is defined by two points, the minimum and maximum (floating point).
// Tries to use the same interface as the image. Rectangle but uses float32 instead of int.
type RectangleF32 struct {
Min, Max PointF32
}
// RectF32 is a shorthand function to create a rectangle.
func RectF32(x0, y0, x1, y1 float32) RectangleF32 {
if x0 > x1 {
x0, x1 = x1, x0
}
if y0 > y1 {
y0, y1 = y1, y0
}
return RectangleF32{PtF32(x0, y0), PtF32(x1, y1)}
}
// RectRelF32 is a shorthand function to create a rectangle specifying its width and height instead of a second coordinate.
func RectRelF32(x, y, w, h float32) RectangleF32 {
return RectangleF32{PointF32{x, y}, PointF32{x + w, y + h}}
}
// Add translates rectangle r by point p.
func (r RectangleF32) Add(p PointF32) RectangleF32 {
return RectangleF32{
PointF32{r.Min.X + p.X, r.Min.Y + p.Y},
PointF32{r.Max.X + p.X, r.Max.Y + p.Y},
}
}
// Center returns the center of the rectangle.
func (r RectangleF32) Center() PointF32 {
return PointF32{.5 * (r.Min.X + r.Max.X), .5 * (r.Min.Y + r.Max.Y)}
}
// Dx returns the width of r.
func (r RectangleF32) Dx() float32 {
return r.Max.X - r.Min.X
}
// Dy returns the height of r.
func (r RectangleF32) Dy() float32 {
return r.Max.Y - r.Min.Y
}
// Inset returns the rectangle r inset by n. The resulting rectangle will never have
// a negative size.
func (r RectangleF32) Inset(n float32) RectangleF32 {
if r.Dx() < 2*n {
r.Min.X = (r.Min.X + r.Max.X) / 2
r.Max.X = r.Min.X
} else {
r.Min.X += n
r.Max.X -= n
}
if r.Dy() < 2*n {
r.Min.Y = (r.Min.Y + r.Max.Y) / 2
r.Max.Y = r.Min.Y
} else {
r.Min.Y += n
r.Max.Y -= n
}
return r
}
// Size returns the size of the rectangle.
func (r RectangleF32) Size() PointF32 {
return PointF32{r.Max.X - r.Min.X, r.Max.Y - r.Min.Y}
}
// Sub translates rectangle r in the opposite direction of point p.
func (r RectangleF32) Sub(p PointF32) RectangleF32 {
return RectangleF32{
PointF32{r.Min.X - p.X, r.Min.Y - p.Y},
PointF32{r.Max.X - p.X, r.Max.Y - p.Y},
}
}
// ToInt returns the integer point representation of r.
func (r RectangleF32) ToInt() Rectangle { return Rectangle{Min: r.Min.ToInt(), Max: r.Max.ToInt()} }
// ToF returns the floating point representation of r.
func (r RectangleF32) ToF() RectangleF { return RectangleF{Min: r.Min.ToF(), Max: r.Max.ToF()} }
// Union gives back the union of the two rectangles.
func (r RectangleF32) Union(s RectangleF32) RectangleF32 {
return RectF32(Min32(r.Min.X, s.Min.X), Min32(r.Min.Y, s.Min.Y), Max32(r.Max.X, s.Max.X), Max32(r.Max.Y, s.Max.Y))
}