Вращение фигуры вокруг собственной оси - C (СИ)
Формулировка задачи:
Здравствуйте. На форуме нашла много подобных тем, но, к сожалению, ошибки у себя не нашла. Помогите, пожалуйста решить проблему.
Фигура вместо того, чтобы вертеться вокруг своей оси вертится вообще где попало.
Заранее спасибо
Полный текст программы
void Ship::func2()
{
int cx=(X4+X1)/2;
int tx1=X1;
int tx2=X2;
int tx3=X3;
int tx4=X4;
int tx5=X5;
int tx6=X6;
int ty1=Y1;
int ty2=Y2;
int ty3=Y3;
int ty4=Y4;
int ty5=Y5;
int ty6=Y6;
if(sost2==0)
{
FI++;
tx1=cx+((X1-cx)*cos(FI*M_PI/180)-(Y1-150)*sin(FI*M_PI/180));
tx2=cx+((X2-cx)*cos(FI*M_PI/180)-(Y2-150)*sin(FI*M_PI/180));
tx3=cx+((X3-cx)*cos(FI*M_PI/180)-(Y3-150)*sin(FI*M_PI/180));
tx4=cx+((X4-cx)*cos(FI*M_PI/180)-(Y4-150)*sin(FI*M_PI/180));
tx5=cx+((X5-cx)*cos(FI*M_PI/180)-(Y5-150)*sin(FI*M_PI/180));
tx6=cx+((X6-cx)*cos(FI*M_PI/180)-(Y6-150)*sin(FI*M_PI/180));
ty1=150+((X1-cx)*sin(FI*M_PI/180)+(Y1-150)*cos(FI*M_PI/180));
ty2=150+((X2-cx)*sin(FI*M_PI/180)+(Y2-150)*cos(FI*M_PI/180));
ty3=150+((X3-cx)*sin(FI*M_PI/180)+(Y3-150)*cos(FI*M_PI/180));
ty4=150+((X4-cx)*sin(FI*M_PI/180)+(Y4-150)*cos(FI*M_PI/180));
ty5=150+((X5-cx)*sin(FI*M_PI/180)+(Y5-150)*cos(FI*M_PI/180));
ty6=150+((X6-cx)*sin(FI*M_PI/180)+(Y6-150)*cos(FI*M_PI/180));
if(FI==20)
{
sost2=1;
}
}
if(sost2==1)
{
FI=FI--;
tx1=cx+((X1-cx)*cos(FI*M_PI/180)-(Y1-150)*sin(FI*M_PI/180));
tx2=cx+((X2-cx)*cos(FI*M_PI/180)-(Y2-150)*sin(FI*M_PI/180));
tx3=cx+((X3-cx)*cos(FI*M_PI/180)-(Y3-150)*sin(FI*M_PI/180));
tx4=cx+((X4-cx)*cos(FI*M_PI/180)-(Y4-150)*sin(FI*M_PI/180));
tx5=cx+((X5-cx)*cos(FI*M_PI/180)-(Y5-150)*sin(FI*M_PI/180));
tx6=cx+((X6-cx)*cos(FI*M_PI/180)-(Y6-150)*sin(FI*M_PI/180));
ty1=150+((X1-cx)*sin(FI*M_PI/180)+(Y1-150)*cos(FI*M_PI/180));
ty2=150+((X2-cx)*sin(FI*M_PI/180)+(Y2-150)*cos(FI*M_PI/180));
ty3=150+((X3-cx)*sin(FI*M_PI/180)+(Y3-150)*cos(FI*M_PI/180));
ty4=150+((X4-cx)*sin(FI*M_PI/180)+(Y4-150)*cos(FI*M_PI/180));
ty5=150+((X5-cx)*sin(FI*M_PI/180)+(Y5-150)*cos(FI*M_PI/180));
ty6=150+((X6-cx)*sin(FI*M_PI/180)+(Y6-150)*cos(FI*M_PI/180));
if(FI==0)
{
sost2=0;
}
}
X1=tx1;
X2=tx2;
X3=tx3;
X4=tx4;
X5=tx5;
X6=tx6;
Y1=ty1;
Y2=ty2;
Y3=ty3;
Y4=ty4;
Y5=ty5;
Y6=ty6;
}//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "math.h"
#include "Unit1.h"
#include "graph.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
class Ship
{
public:
public:
int X1, Y1;
int X2, Y2;
int X3, Y3;
int X4, Y4;
int X5, Y5;
int X6, Y6;
int X7, Y7;
int X8, Y8;
int sost1,sost2;
int rast1,rast2;
double FI;
Ship( int x1, int y1, int x2, int y2,int x3, int y3,int x4, int y4,int x5, int y5,int x6, int y6,int x7, int y7,int x8, int y8);
void func1();
void func2();
void func3();
void Show();
};
Ship *W1,*W2,*W3;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
Ship::Ship( int x1, int y1, int x2, int y2,int x3, int y3,int x4, int y4,int x5, int y5,int x6, int y6,int x7, int y7,int x8, int y8)
{
this->X1=x1;
this->Y1=y1;
this->X2=x2;
this->Y2=y2;
this->X3=x3;
this->Y3=y3;
this->X4=x4;
this->Y4=y4;
this->X5=x5;
this->Y5=y5;
this->X6=x6;
this->Y6=y6;
this->X7=x7;
this->Y7=y7;
this->X8=x8;
this->Y8=y8;
sost1=0;
rast1=0;
sost2=0;
rast2=0;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
initgraph(Handle);
W1 = new Ship(100,100,150,150,100,200,300,100,250,150,300,200,190,150,210,150);
W2 = new Ship(500,100,550,150,500,200,700,100,650,150,700,200,590,150,610,150);
W3 = new Ship(900,100,950,150,900,200,1100,100,1050,150,1100,200,990,150,1010,150);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
closegraph();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Repaint();
W1->func1();
W1->Show();
W2->func2();
W2->Show();
W3->func1();
//W3->func2();
W3->Show();
}
void Ship::Show()
{
line(X1,Y1,X2,Y2);
line(X2,Y2,X3,Y3);
line(X4,Y4,X5,Y5);
line(X5,Y5,X6,Y6);
line(X7,Y7,X8,Y8);
}
void Ship::func1()
{
if(sost1==0)
{
rast1++;
X1-=2;
X2-=2;
X3-=2;
X4+=2;
X5+=2;
X6+=2;
if(rast1==25)
{
sost1=1;
rast1=0;
}
}
else if(sost1==1)
{
rast1++;
X1+=2;
X2+=2;
X3+=2;
X4-=2;
X5-=2;
X6-=2;
if(rast1==25)
{
sost1=0;
rast1=0;
}
}
}
void Ship::func2()
{
int cx=(X4+X1)/2;
int tx1=X1;
int tx2=X2;
int tx3=X3;
int tx4=X4;
int tx5=X5;
int tx6=X6;
int ty1=Y1;
int ty2=Y2;
int ty3=Y3;
int ty4=Y4;
int ty5=Y5;
int ty6=Y6;
if(sost2==0)
{
FI++;
tx1=cx+((X1-cx)*cos(FI*M_PI/180)-(Y1-150)*sin(FI*M_PI/180));
tx2=cx+((X2-cx)*cos(FI*M_PI/180)-(Y2-150)*sin(FI*M_PI/180));
tx3=cx+((X3-cx)*cos(FI*M_PI/180)-(Y3-150)*sin(FI*M_PI/180));
tx4=cx+((X4-cx)*cos(FI*M_PI/180)-(Y4-150)*sin(FI*M_PI/180));
tx5=cx+((X5-cx)*cos(FI*M_PI/180)-(Y5-150)*sin(FI*M_PI/180));
tx6=cx+((X6-cx)*cos(FI*M_PI/180)-(Y6-150)*sin(FI*M_PI/180));
ty1=150+((X1-cx)*sin(FI*M_PI/180)+(Y1-150)*cos(FI*M_PI/180));
ty2=150+((X2-cx)*sin(FI*M_PI/180)+(Y2-150)*cos(FI*M_PI/180));
ty3=150+((X3-cx)*sin(FI*M_PI/180)+(Y3-150)*cos(FI*M_PI/180));
ty4=150+((X4-cx)*sin(FI*M_PI/180)+(Y4-150)*cos(FI*M_PI/180));
ty5=150+((X5-cx)*sin(FI*M_PI/180)+(Y5-150)*cos(FI*M_PI/180));
ty6=150+((X6-cx)*sin(FI*M_PI/180)+(Y6-150)*cos(FI*M_PI/180));
if(FI==20)
{
sost2=1;
}
}
if(sost2==1)
{
FI=FI--;
tx1=cx+((X1-cx)*cos(FI*M_PI/180)-(Y1-150)*sin(FI*M_PI/180));
tx2=cx+((X2-cx)*cos(FI*M_PI/180)-(Y2-150)*sin(FI*M_PI/180));
tx3=cx+((X3-cx)*cos(FI*M_PI/180)-(Y3-150)*sin(FI*M_PI/180));
tx4=cx+((X4-cx)*cos(FI*M_PI/180)-(Y4-150)*sin(FI*M_PI/180));
tx5=cx+((X5-cx)*cos(FI*M_PI/180)-(Y5-150)*sin(FI*M_PI/180));
tx6=cx+((X6-cx)*cos(FI*M_PI/180)-(Y6-150)*sin(FI*M_PI/180));
ty1=150+((X1-cx)*sin(FI*M_PI/180)+(Y1-150)*cos(FI*M_PI/180));
ty2=150+((X2-cx)*sin(FI*M_PI/180)+(Y2-150)*cos(FI*M_PI/180));
ty3=150+((X3-cx)*sin(FI*M_PI/180)+(Y3-150)*cos(FI*M_PI/180));
ty4=150+((X4-cx)*sin(FI*M_PI/180)+(Y4-150)*cos(FI*M_PI/180));
ty5=150+((X5-cx)*sin(FI*M_PI/180)+(Y5-150)*cos(FI*M_PI/180));
ty6=150+((X6-cx)*sin(FI*M_PI/180)+(Y6-150)*cos(FI*M_PI/180));
if(FI==0)
{
sost2=0;
}
}
X1=tx1;
X2=tx2;
X3=tx3;
X4=tx4;
X5=tx5;
X6=tx6;
Y1=ty1;
Y2=ty2;
Y3=ty3;
Y4=ty4;
Y5=ty5;
Y6=ty6;
}
void Ship::func3()
{
}Решение задачи: «Вращение фигуры вокруг собственной оси»
textual
Листинг программы
void Ship::func2()
{
double x0=(X4+X1)/2;
double y0= 150;
double phi = 1.;
rotate2D(X1, Y1, x0, y0, phi);
rotate2D(X2, Y2, x0, y0, phi);
rotate2D(X3, Y3, x0, y0, phi);
rotate2D(X4, Y4, x0, y0, phi);
rotate2D(X5, Y5, x0, y0, phi);
rotate2D(X6, Y6, x0, y0, phi);
}
Объяснение кода листинга программы
В данном коде функция func2() выполняет вращение 3D-фигуры вокруг её оси. Номер переменной соответствует номеру точки на фигуре (от 1 до 6). Значения переменных:
double x0- координата X центра вращенияdouble y0- координата Y центра вращенияdouble phi- угол вращения Функцияrotate2D()выполняет вращение точки на заданный угол вокруг центра вращения. Передаются координаты точки (X, Y) и параметры вращения (x0, y0, phi).