oreboat Not sure what your code is doing. Line positionVector.x / 2 does nothing. You probably meant to use /= operator. Same for *= later. Apart from that the constrain code looks suspicious.
Here's generalized example that can handle any arbitrary ellipse.
Educational version 😉:
func constrain_point_inside_ellipse(p: Vector2, ellipse_center: Vector2, ellipse_size: Vector2) -> Vector2:
var ratio: Vector2 = Vector2(1.0, ellipse_size.x / ellipse_size.y)
var radius: float = ellipse_size.x / 2.0
var relative: Vector2 = (p - ellipse_center) # position relative to ellipse center
relative *= ratio # scale to circle space
relative = relative.normalized() * min(radius, relative.length()) # constrain to circle radius
relative /= ratio # scale back to ellipse space
return ellipse_center + relative
And compact version:
func constrain_point_inside_ellipse(p: Vector2, ellipse_center: Vector2, ellipse_size: Vector2) -> Vector2:
var r = Vector2(1.0, ellipse_size.x / ellipse_size.y)
var d = (p - ellipse_center) * r
return ellipse_center + d.normalized() * min(ellipse_size.x * .5, d.length()) / r