Привязать точку к окружности. С++ WinBGIm

Есть код, который рисует срдце, а также меняет масштаб и вращает сердце. Проблема в том, что линии, соединяющие эллипсы в сердце не привязаны к этим эллипсам, из-за чего при вращении эти линии ведут себя произвольно. Точки пронумерованы в коде, это: 3, 5, 4, 2. Также приложу рисунок для наглядности. Нужно привязать эти точки к элиипсам, чтобы при вращении это выглядело нормально. Буду благодарен, за любую помощь. Преподователь дал формулу и сказал, что в ней уже всё есть, но я в математике ни гу-гу, по-этому прошу помощи тут. Прошу прощения, что так много кода, я ещё не знаю, как тут правильно расписывать вопросы. Программа не работает без библиотеки Winbgim, но если она у вас есть, то вращать сердце можно на кнопку Home.Вот и сама проблема Вот и сердце, на нём указаны точки, которые нужно "привязать" к окружностям Тут указано расположение всех точек, а также их нумерация и их координаты Формула, которую дал преподователь

#include <iostream>
#include <conio.h>
#include "winbgim.h"
#include <math.h>
#define ESC 27 //escape
#define LEFT 75 //стрелка влево
#define RIGHT 77 //стрелка вправо
#define TOP 72 //стрелка вверх
#define BOT 80 //стрелка вниз
#define ROTX 83 //del
#define ROTY 71 //home
#define ROTZ 79 //end
#define RSZP 73 //pgup
#define RSZM 81 //pgdn

struct Dot3d
{
int x, y, z;
};
Dot3d Heart[10];
int Mashtab=50;
int Rebra[5][2]={{1, 2}, {1, 3}, {0, 4}, {0,5}, {0,1}};   //В массив записываются пары точек, которые должны соединятся линиями

int AngleX=0;
int AngleY=0;
int AngleZ=0;

void PaintHeart(Dot3d *);
void InitHeart(int, int, int, int);
void OffsetHeartHorizontal(int);
void OffsetHeartVertical(int);
void OffsetHeartResize(int);
void rotationX(int);
void rotationZ(int);
void rotationY(int);
void ResizePlus(int);
void ResizeMinus(int);

int main(int argc, char** argv) {
int Mx, My;
int Krok=10;
initwindow(1200, 1000);
Mx = getmaxx()/2;;
My = getmaxy()/2;;

InitHeart(Mx,My,0, Mashtab);
PaintHeart(Heart);
int v;
while (getch()!= ESC)
{
{
v=getch();
if (v== RIGHT)
{
OffsetHeartHorizontal(Krok);
};
if (v== LEFT)
{
OffsetHeartHorizontal(-Krok);
};
if (v== BOT)
{
OffsetHeartVertical(Krok);
};
if (v== TOP)
{
OffsetHeartVertical(-Krok);
};
if (v== ROTX)
{
rotationX(15) ;
}
if (v== ROTY)
{
rotationY(15) ;
}
if (v== ROTZ)
{
rotationZ(15) ;
}
if (v== RSZM)
{
    ResizeMinus(5) ;
    }
    if (v== RSZP)
    {
    ResizePlus(5) ;
    }
    std::cout<<v;
    }
    cleardevice();
    PaintHeart(Heart);
    }

    getch();
    return 0;
    }
    void InitHeart(int x1, int y1, int z1, int m)  //В этой функции прописываются координаты точек
    {
    Heart[0].x=x1;                 Heart[0].y=y1;          Heart[0].z=z1;
    Heart[1].x=Heart[0].x;             Heart[1].y=Heart[0].y-1*m;      Heart[1].z=Heart[0].z+1*m;
    Heart[2].x=Heart[0].x-1.3*m;           Heart[2].y=Heart[0].y-2.5*m;     Heart[2].z=Heart[0].z+1*m;
    Heart[3].x=Heart[0].x+1.3*m;           Heart[3].y=Heart[0].y-2.5*m;    Heart[3].z=Heart[0].z+1*m;
    Heart[4].x=Heart[0].x-2.2*m;           Heart[4].y=Heart[0].y-2.2*m;     Heart[4].z=Heart[0].z+1*m;
    Heart[5].x=Heart[0].x+2.2*m;           Heart[5].y=Heart[0].y-2.2*m;    Heart[5].z=Heart[0].z+1*m;
    Heart[6].x=Heart[0].x-1.9*m/2;         Heart[6].y=Heart[0].y-3*m;        Heart[6].z=Heart[0].z;
    Heart[7].x=Heart[0].x+1.5*m/2;         Heart[7].y=Heart[0].y-3*m;        Heart[7].z=Heart[0].z;
    Heart[8].x=Heart[0].x-2.5*m/2;         Heart[8].y=Heart[0].y-3*m;        Heart[8].z=Heart[0].z;
    Heart[9].x=Heart[0].x+62.5;        Heart[9].y=Heart[0].y-3*m;        Heart[9].z=Heart[0].z;

    for(int i=1; i<10; i++)
    {
Heart[i].x=Heart[0].x+(Heart[i].x-Heart[0].x)*cos(AngleY*3.14/180)-(Heart[i].z-Heart[0].z)*sin(AngleY*3.14/180);
Heart[i].z=Heart[0].z+(Heart[i].x-Heart[0].x)*sin(AngleY*3.14/180)+(Heart[i].z-Heart[0].z)*cos(AngleY*3.14/180);
Heart[i].y=Heart[0].y+(Heart[i].y-Heart[0].y)*cos(AngleX*3.14/180)-(Heart[i].y-Heart[0].y)*sin(AngleX*3.14/180);
Heart[i].z=Heart[0].z+(Heart[i].z-Heart[0].z)*sin(AngleX*3.14/180)+(Heart[i].z-Heart[0].z)*cos(AngleX*3.14/180);
Heart[i].x=Heart[0].x+(Heart[i].x-Heart[0].x)*cos(AngleZ*3.14/180)-(Heart[i].y-Heart[0].y)*sin(AngleZ*3.14/180);
Heart[i].y=Heart[0].y+(Heart[i].x-Heart[0].x)*sin(AngleZ*3.14/180)+(Heart[i].y-Heart[0].y)*cos(AngleZ*3.14/180);
}
for(int i=1; i<10; i++)
{   
}
for(int i=1; i<10; i++)
{
}
}
void PaintHeart(Dot3d *c)   //Функция соединяет точки линиями
{
int yt1, yt2, xt1, xt2;
double koefZX=sin(AngleX*3.14/180);
double koefZY=cos(AngleY*3.14/180);
koefZX=0;
koefZY=0;

    for(int i=0; i<=1; i++)   //Построение линий, соединяющих задние эллипсы  
{
    xt1=c[Rebra[i][0]].x;
    yt1=c[Rebra[i][0]].y;
    xt2=c[Rebra[i][1]].x;
    yt2=c[Rebra[i][1]].y;

    setcolor(10);
    line(xt1, yt1, xt2, yt2);

}

for(int i=2; i<=4; i++)   //Построение линий, которые соединяют передние эллипсы
{
    xt1=c[Rebra[i][0]].x-c[Rebra[i][0]].z*koefZX;
    yt1=c[Rebra[i][0]].y-c[Rebra[i][0]].z*koefZY;
    xt2=c[Rebra[i][1]].x-c[Rebra[i][1]].z*koefZX;
    yt2=c[Rebra[i][1]].y-c[Rebra[i][1]].z*koefZY;

    setcolor(4);
    line(xt1, yt1, xt2, yt2);

}

setcolor(10);
ellipse(c[6].x, c[6].y, 0, 360, 1.5*Mashtab/2, 1.5*Mashtab/2);
ellipse(c[7].x, c[7].y, 0, 360, 1.5*Mashtab/2, 1.5*Mashtab/2);


setcolor(4);

ellipse(c[8].x +c[8].z*koefZX, c[8].y -c[8].z *koefZY, 0, 360, 2.5*Mashtab/2, 2.5*Mashtab/2);
ellipse(c[9].x +c[9].z*koefZX, c[9].y -c[9].z *koefZY, 0, 360, 2.5*Mashtab/2, 2.5*Mashtab/2);


}

void OffsetHeartHorizontal(int ofs)
{
for(int i=0; i<10; i++)
{
Heart[i].x=Heart[i].x+ofs;
}
}
void OffsetHeartVertical(int ofs)
{
for(int i=0; i<10; i++)
{
Heart[i].y=Heart[i].y+ofs;
}
}
void OffsetHeartResize(int r)
{
Mashtab=Mashtab+r;
}
void rotationX(int a)
{
AngleX=AngleX+a;
InitHeart(Heart[0].x, Heart[0].y, Heart[0].y, Mashtab);
}
void rotationY(int a)
{
AngleY=AngleY+a;
InitHeart(Heart[0].x, Heart[0].y, Heart[0].y, Mashtab);
}
void rotationZ(int a)
{
AngleZ=AngleZ+a;
InitHeart(Heart[0].x, Heart[0].y, Heart[0].y, Mashtab);
}
void ResizePlus(int r)
{
Mashtab=Mashtab+r;
InitHeart(Heart[0].x, Heart[0].y, Heart[0].y, Mashtab);
}
void ResizeMinus(int r)
{
Mashtab=abs(Mashtab-r);
InitHeart(Heart[0].x, Heart[0].y, Heart[0].y, Mashtab);
}

Ответы (0 шт):