Well, at least if you used AffineTransform you’d be using the right algorithm, and have something that still performs better than this! You could also look and see if there’s a utility in libGDX for applying matrices to a sequence of points.
Well, using halfHeight on y coordinates would be a start!
I think you’re missing the point. The rotation code rotates around 0,0. So, you need to effectively translate your entity so it’s mid-point is at 0,0, apply the rotation, then translate it back to where it was. Or just use something that handles all that for you until you understand what is going on.