diff --git a/geometry.go b/geometry.go
index b426686ad600f6efffeaa61b35f5154b2cfbefe0..d89217f0e208043794212091d917562503334ed5 100644
--- a/geometry.go
+++ b/geometry.go
@@ -97,6 +97,15 @@ func (u Vec) Cross(v Vec) float64 {
 	return u.X()*v.Y() - v.X()*u.Y()
 }
 
+// Apply applies the function f to both x and y components of the vector u and returns the modified
+// vector.
+func (u Vec) Apply(f func(float64) float64) Vec {
+	return V(
+		f(u.X()),
+		f(u.Y()),
+	)
+}
+
 // Rect is a 2D rectangle aligned with the axes of the coordinate system. It has a position
 // and a size.
 //