Вращение фигуры вокруг собственной оси - 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д