Здравствуйте, Минус!
Вы же не предусматриваете сохранения исходного положения. Точнее движение то работает с копией массива. А вот в процедуре сдвига вы изначально хоть присваиваете внутреннему указателю значение указателя основного массива вершин (хотя это верх наглости - сначала выделить НОВУЮ память под массив из n структур типа POINT, а потом единственный указатель на эту память затереть другим значением - утечка гарантирована, да еще и при каждом вызове процедуры движения), однако затем вы по этому укзателю и работаете, то есть вы изменяете значения координат изначальных вершин.
Могу предложить тщательно почистить код - ооочень много лишнего и использовать следующую схему работы:
в каждой процедуре изменения многоугольника копировать САМ массив а НЕ его указатель в локальный, работать с ним можно и как сейчас в принципе и потом обязательно удалять после использования. Во всяком случае если вы не под .NET работаете - это там сборщик мусора есть
и то я лично пока его в работе тщательно не опробовал, по-этому не буду советовать ему доверять.