Что вам нужно, так это иерархия преобразований. По сути, то, что делается все время в 3D, только вы используете 2D математику для этого. Таким образом, вместо аффинных матриц 4x4 у вас есть аффинные матрицы 3x3.
Каждая отдельная фигура должна иметь локальное преобразование. Вращение самого себя вокруг своего центра (относительно нейтрального вращения) и перемещение себя в эту центральную точку относительно своего родительского объекта. Вы строите это преобразование как матрицу 3х3.
Вам нужна иерархия объектов: дерево. Ваше «тело» - это узел в дереве. У него есть дочерние узлы: две верхние ноги, две верхние руки и голова. Каждая верхняя нога имеет нижнюю ногу как ребенок, так же как каждая верхняя рука имеет нижнюю руку как ребенок. И так далее.
Итак, когда приходит время рисовать все, вы накапливаете матрицы. Вы получаете матрицу преобразования тела, трансформируете тело им и визуализируете ее. Затем вы получаете каждого потомка тела, умножаете его преобразование на его родителя, трансформируете эту форму в эту новую матрицу и визуализируете ее. Затем для каждого из них вы повторяете процесс: берете родительскую матрицу, применяете ее локальную матрицу к этой родительской матрице, трансформируете объект с помощью новой матрицы и визуализируете ее. Повторяйте всю иерархию объектов.
Действительно, лучший способ понять это - посмотреть, как это делают 3D-рендеры. 2D-рендеринг - это особый случай, когда вы вращаетесь только вокруг Z и имеете только 2D-перевод.