Ah, did not recognize, you wrote a complete piece of software for this.
ok, I got one question:
Did you take into account the centre issue, meaning to add an offset onto the phase off 0,5 dots in order to hit the middle of a covered area?
The problem of the digital sinewaves are usually that they have an even number of dots, like 16,32, 63 or so, and thus it is not easy to mirror them using just one quarter.
Counting is: 0,1,2,3,4,3,2,1 - but better was: 0,1,2,3,3,2,1,0
This requires the Y-values to represent the value in between 0 and 1 meaning Y=sin(PI * (k + 0,5)/k). I tried to describe this in the above linked article.
For C/C++ and larger speed grades of CPUs this is not a problem, but if you want to implement sine wave tables (or any other table similar) in PLDs or FPGAs, you can save one bit for the phase accumulator and also obtain the mirrored phase but just a bit negation. For example in a MAX2 device, a sine wave DDS at a given precision, could run at 220MHz instead or only 140, when used the classical way.