Skip to content

Commit fc2b1c8

Browse files
committed
Add cast functions to types packages
1 parent e2ea82e commit fc2b1c8

File tree

6 files changed

+94
-20
lines changed

6 files changed

+94
-20
lines changed

math.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,13 @@ func EqualDelta[T Number](a, b T, delta float64) bool {
7979
func equalDelta(a, b, delta float64) bool {
8080
return math.Abs(a-b) <= delta
8181
}
82+
83+
// Transform applies a function to each element in a slice
84+
func Transform[S ~[]E, E any, T any](input S, fn func(E) T) []T {
85+
output := make([]T, len(input))
86+
for i, v := range input {
87+
output[i] = fn(v)
88+
}
89+
90+
return output
91+
}

polygon.go

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package geom
22

3-
// Polygon is a 2D polygon with 3+ transform.
3+
// Polygon is a 2D polygon with 3+ vertices.
44
type Polygon[T Number] struct {
55
Vertices []Point[T]
66
}
77

8-
// Center returns the polygon centroid computed as the average of its transform.
8+
// Center returns the polygon centroid computed as the average of its vertices.
99
func (p Polygon[T]) Center() Point[T] {
1010
var x, y T
1111
l := T(len(p.Vertices))
@@ -16,9 +16,9 @@ func (p Polygon[T]) Center() Point[T] {
1616
return Point[T]{x / l, y / l}
1717
}
1818

19-
// Translate creates a new Polygon translated by the given vector (applied to all transform).
19+
// Translate creates a new Polygon translated by the given vector (applied to all vertices).
2020
func (p Polygon[T]) Translate(vector Vector[T]) Polygon[T] {
21-
return Polygon[T]{transform(p.Vertices, func(e Point[T]) Point[T] {
21+
return Polygon[T]{Transform(p.Vertices, func(e Point[T]) Point[T] {
2222
return e.Add(vector)
2323
})}
2424
}
@@ -31,24 +31,15 @@ func (p Polygon[T]) MoveTo(point Point[T]) Polygon[T] {
3131
// Scale creates a new Polygon uniformly scaled about its centroid by the factor.
3232
func (p Polygon[T]) Scale(scale float64) Polygon[T] {
3333
center := p.Center()
34-
return Polygon[T]{transform(p.Vertices, func(point Point[T]) Point[T] {
34+
return Polygon[T]{Transform(p.Vertices, func(point Point[T]) Point[T] {
3535
return center.Add(point.Subtract(center).Multiply(scale))
3636
})}
3737
}
3838

3939
// ScaleXY creates a new Polygon scaled about its centroid by the factors.
4040
func (p Polygon[T]) ScaleXY(scaleX, scaleY float64) Polygon[T] {
4141
center := p.Center()
42-
return Polygon[T]{transform(p.Vertices, func(point Point[T]) Point[T] {
42+
return Polygon[T]{Transform(p.Vertices, func(point Point[T]) Point[T] {
4343
return center.Add(point.Subtract(center).MultiplyXY(scaleX, scaleY))
4444
})}
4545
}
46-
47-
func transform[S ~[]E, E any, T any](input S, fn func(E) T) []T {
48-
output := make([]T, len(input))
49-
for i, v := range input {
50-
output[i] = fn(v)
51-
}
52-
53-
return output
54-
}

polygon_regular.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"math"
55
)
66

7-
// RegularPolygon is a polygon with equally spaced transform around a center.
7+
// RegularPolygon is a polygon with equally spaced Transform around a center.
88
type RegularPolygon[T Number] struct {
99
Center Point[T]
1010
Size Size[T]
@@ -16,17 +16,17 @@ func RP[T Number](center Point[T], size Size[T], n int) RegularPolygon[T] {
1616
return RegularPolygon[T]{center, size, n}
1717
}
1818

19-
// Triangle creates a RegularPolygon with 3 transform.
19+
// Triangle creates a RegularPolygon with 3 Transform.
2020
func Triangle[T Number](center Point[T], size Size[T]) RegularPolygon[T] {
2121
return RegularPolygon[T]{center, size, 3}
2222
}
2323

24-
// Square creates a RegularPolygon with 4 transform.
24+
// Square creates a RegularPolygon with 4 Transform.
2525
func Square[T Number](center Point[T], size Size[T]) RegularPolygon[T] {
2626
return RegularPolygon[T]{center, size, 4}
2727
}
2828

29-
// Hexagon creates a RegularPolygon with 6 transform.
29+
// Hexagon creates a RegularPolygon with 6 Transform.
3030
func Hexagon[T Number](center Point[T], size Size[T]) RegularPolygon[T] {
3131
return RegularPolygon[T]{center, size, 6}
3232
}
@@ -51,7 +51,7 @@ func (rp RegularPolygon[T]) ScaleXY(scaleX, scaleY float64) RegularPolygon[T] {
5151
return RegularPolygon[T]{rp.Center, rp.Size.ScaleXY(scaleX, scaleY), rp.N}
5252
}
5353

54-
// Vertices returns the polygon transform in order starting from angle 0, counter-clockwise.
54+
// Vertices returns the polygon Transform in order starting from angle 0, counter-clockwise.
5555
func (rp RegularPolygon[T]) Vertices() []Point[T] {
5656
initAngle := 0.0
5757
angleStep := 2 * math.Pi / float64(rp.N)

rectangle.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ func RectangleFromMinMax[T Number](min, max Point[T]) Rectangle[T] {
2323
return RectangleFromMin(min, S(max.Subtract(min).XY()))
2424
}
2525

26+
// RectangleFromSize creates a Rectangle from zero point and size.
27+
func RectangleFromSize[T Number](size Size[T]) Rectangle[T] {
28+
return Rectangle[T]{P[T](0, 0), size}
29+
}
30+
2631
// Translate creates a new Rectangle translated by the given vector.
2732
func (r Rectangle[T]) Translate(vector Vector[T]) Rectangle[T] {
2833
return Rectangle[T]{r.Center.Add(vector), r.Size}

types/floats/types.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,37 @@ type Line = geom.Line[float64]
1010
type Rectangle = geom.Rectangle[float64]
1111
type Polygon = geom.Polygon[float64]
1212
type RegularPolygon = geom.RegularPolygon[float64]
13+
14+
func ToPoint[T geom.Number](point geom.Point[T]) Point {
15+
return Point{float64(point.X()), float64(point.Y())}
16+
}
17+
18+
func ToVector[T geom.Number](vector geom.Vector[T]) Vector {
19+
return Vector{float64(vector.X()), float64(vector.Y())}
20+
}
21+
22+
func ToSize[T geom.Number](size geom.Size[T]) Size {
23+
return Size{float64(size.Width()), float64(size.Height())}
24+
}
25+
26+
func ToCircle[T geom.Number](circle geom.Circle[T]) Circle {
27+
return Circle{ToPoint(circle.Center), float64(circle.Radius)}
28+
}
29+
30+
func ToLine[T geom.Number](line geom.Line[T]) Line {
31+
return Line{ToPoint(line.Start), ToPoint(line.End)}
32+
}
33+
34+
func ToRectangle[T geom.Number](rectangle geom.Rectangle[T]) Rectangle {
35+
return Rectangle{ToPoint(rectangle.Center), ToSize(rectangle.Size)}
36+
}
37+
38+
func ToPolygon[T geom.Number](polygon geom.Polygon[T]) Polygon {
39+
return Polygon{geom.Transform(polygon.Vertices, func(point geom.Point[T]) Point {
40+
return ToPoint(point)
41+
})}
42+
}
43+
44+
func ToRegularPolygon[T geom.Number](polygon geom.RegularPolygon[T]) RegularPolygon {
45+
return RegularPolygon{ToPoint(polygon.Center), ToSize(polygon.Size), polygon.N}
46+
}

types/ints/types.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,37 @@ type Line = geom.Line[int]
1010
type Rectangle = geom.Rectangle[int]
1111
type Polygon = geom.Polygon[int]
1212
type RegularPolygon = geom.RegularPolygon[int]
13+
14+
func ToPoint[T geom.Number](point geom.Point[T]) Point {
15+
return Point{geom.Cast[int](float64(point.X)), geom.Cast[int](float64(point.Y))}
16+
}
17+
18+
func ToVector[T geom.Number](vector geom.Vector[T]) Vector {
19+
return Vector{geom.Cast[int](float64(vector.X)), geom.Cast[int](float64(vector.Y))}
20+
}
21+
22+
func ToSize[T geom.Number](size geom.Size[T]) Size {
23+
return Size{geom.Cast[int](float64(size.Width)), geom.Cast[int](float64(size.Height))}
24+
}
25+
26+
func ToCircle[T geom.Number](circle geom.Circle[T]) Circle {
27+
return Circle{ToPoint(circle.Center), geom.Cast[int](float64(circle.Radius))}
28+
}
29+
30+
func ToLine[T geom.Number](line geom.Line[T]) Line {
31+
return Line{ToPoint(line.Start), ToPoint(line.End)}
32+
}
33+
34+
func ToRectangle[T geom.Number](rectangle geom.Rectangle[T]) Rectangle {
35+
return Rectangle{ToPoint(rectangle.Center), ToSize(rectangle.Size)}
36+
}
37+
38+
func ToPolygon[T geom.Number](polygon geom.Polygon[T]) Polygon {
39+
return Polygon{geom.Transform(polygon.Vertices, func(point geom.Point[T]) Point {
40+
return ToPoint(point)
41+
})}
42+
}
43+
44+
func ToRegularPolygon[T geom.Number](polygon geom.RegularPolygon[T]) RegularPolygon {
45+
return RegularPolygon{ToPoint(polygon.Center), ToSize(polygon.Size), polygon.N}
46+
}

0 commit comments

Comments
 (0)