Вращение фигуры вокруг собственной оси - 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). Значения переменных:

  1. double x0 - координата X центра вращения
  2. double y0 - координата Y центра вращения
  3. double phi - угол вращения Функция rotate2D() выполняет вращение точки на заданный угол вокруг центра вращения. Передаются координаты точки (X, Y) и параметры вращения (x0, y0, phi).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы