You utalize roots of circles principles from an offset point.
Make the immaginary axcess y and the real axcess x.
Thats all there is to it.
Basically e^i2pi represents a full rotation and brings you back to where you started.
Due to the forumal e^iangle = cos(angle)+isin(angle) you can break it appart using what I orignally said (angle represents theta or a variable in radians).
Thus as x is real, x = cos(angle) and as y is imaginary (iy), iy = isin(angle) which is the same as y = sin(angle).
But how do we get the radius into this?
Well simple, as |e^iangle| = 1 , that means that the radius of the circle is always 1. If we want a circle with a larger radius, we simply multiply e^iangle by a scalar. Thus re^iangle where r is radius.
This translates directly to our equations.
x = rcos(angle)
y = rsin(angle)
But you do not want the circle always in the middle of the map, thus offsets are needed.
x = rcos(angle)+xoff
y = rsin(angle)+yoff
Where x/yoff are the offsets to where you want the circle midpoint to be.
This gives you the formula for how to a point on a circle, but not how to arrange points evenly around a circle.
For that we use the roots of a circle theory which basically lets you generate points in a circle with a fixed angle offset from each other with a common midpoint.
(e^(iu))^n where u is the unity angle and n is the unity number.
e^(iun) means the same thing due to properties of indicies.
so how do we calculate u, as a circle is 2pi radians and we want points evenly spaced out, logically we divide it by the number of points we want to have (the root of the circle). Thus e^(i2pin/root) where root is the number of points on the circle you want.
Due to you also wanting it to spin, we must add some form of offset to the equation like e^(i2pin/root) * e^(ioff) where off is the offset angle which turns into e^(i(2pin/root+off)).
Due do subsitutation of angle with 2pin/root+off we get.
x = rcos(2pin/root+off)+xoff
y = rsin(2pin/root+off)+yoff
Or in computer form
x = r*cos(2*pi*n/root+off)+xoff
y = r*sin(2*pi*n/root+off)+yoff
for n, use any root (the value root in the formula) number of consecutive numbers with an interval of 1. Eg for root = 4, n ={0,1,2,3} or n ={4,3,2,1} or even n ={1337,1338,1339,1340} as long as the numbers are consecutive. I advise using eithor 1 or 0 and incrimenting upwards as that is the easiest and most logical to do as you can use root as part of the loop termination condtion.
You incriment offset (off) and radius (r) every time you regenerate the circle to get it to move. yoff and xoff should be the mid point of the circle, and if that is a unit you should perodically update it to be the units current position.
For more vluid moving points around a circle, you have to impliment a buffer movement layer which aims to move them into the positions calculated above but does so only at a certain rate, this would allow the points to gradually realign im the case of root being decrimented by 1 instead of instantly changing shape to match the new roots of the circle.