Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 16

Вращение фигуры вокруг собственной оси

22.01.2017, 21:37. Показов 6148. Ответов 14

Студворк — интернет-сервис помощи студентам
Здравствуйте. На форуме нашла много подобных тем, но, к сожалению, ошибки у себя не нашла. Помогите, пожалуйста решить проблему.
Фигура вместо того, чтобы вертеться вокруг своей оси вертится вообще где попало.
Заранее спасибо
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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;
}

Полный текст программы
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
//---------------------------------------------------------------------------
 
#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()
{
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2017, 21:37
Ответы с готовыми решениями:

Вращение отрезка вокруг точки
Здравствуйте, помогите с заданием, никогда не работала с графикой и свойствами подобных объектов на языке си... Данную задачу могу...

Вращение фигуры вокруг произвольной оси
Приветствую! Подскажите формулу для вращения. К примеру есть квадрат или любой другой объект, который нужно повернуть вокруг своей оси...

Вращение фигуры вокруг центра оси
Имеется след. класс фигуры: class Model { /// &lt;summary&gt; /// Массив рёбер /// &lt;/summary&gt; ...

14
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.01.2017, 22:01
Didelphidae, ужас то какой, ты явно что-то делаешь не так, как задумано.
Обычно задачи с поворотами и прочими преобразованиями решаются через вектора и матрицы.
Твоя задача решается умножением каждой точки относительно оси вращения на матрицу поворота.

Добавлено через 2 минуты
По крайней мере вынести операцию поворота некоторой точки (x, y) относительно оси (x0, y0) на угол https://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha в отдельную функцию. Тогда искать ошибки будет на порядок проще.
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 16
22.01.2017, 22:05  [ТС]
Didelphidae, ужас то какой, ты явно что-то делаешь не так, как задумано.
Обычно задачи с поворотами и прочими преобразованиями решаются через вектора и матрицы.
Твоя задача решается умножением каждой точки относительно оси вращения на матрицу поворота.

Добавлено через 2 минуты
По крайней мере вынести операцию поворота некоторой точки (x, y) относительно оси (x0, y0) на угол https://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha в отдельную функцию. Тогда искать ошибки будет на порядок проще.
Ну в задании нужно было сделать именно так. Там в отдельной функции func2() (которую я вынесла отдельно), как раз идет поворот при помощи матрицы поворота.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.01.2017, 22:24
Цитата Сообщение от Didelphidae Посмотреть сообщение
Там в отдельной функции func2() (которую я вынесла отдельно), как раз идет поворот при помощи матрицы поворота.
А какая у тебя ось вращения? Поворот относительный или абсолютный?
Цитата Сообщение от Didelphidae Посмотреть сообщение
вертится вообще где попало
Что это значит? Он все же вокруг чего-то вертится? Может просто ось задана неверно?
0
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 16
22.01.2017, 22:34  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
А какая у тебя ось вращения? Поворот относительный или абсолютный?
Вращаться фигура должна относительно центральной точки. Фигура 2 стрелки, направленные внутрь и полоска посередине. Типа так: >-<. Стрелки должны вертеться вокруг полоски.
Про абсолютный или относительный угол не поняла.
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Что это значит? Он все же вокруг чего-то вертится? Может просто ось задана неверно?
фигура вертится не вокруг какой-то точки, а реально непредсказуемо
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.01.2017, 23:42
Didelphidae,
1) Поворот у тебя относительный, т.е. относительно текущей позиции мы в каждый момент времени фигуру чуть-чуть доворачиваем. sin и cos - функции вещественные, так что логичным будет типы координат сменить на double, а к int преобразовывать перед отрисовкой.
2) Тогда можно сделать такую функцию поворота:
C++
1
2
3
4
void rotate2D(double &x, double &y, double x0, double y0, double phi) {
    x=x0+(x-x0)*cos(phi*M_PI/180)-(y-y0)*sin(phi*M_PI/180);
    y=y0+(x-x0)*sin(phi*M_PI/180)+(y-y0)*cos(phi*M_PI/180);
}
Догадаешься, как ее применить?
3) Фигня с FI++ и FI-- это бред какой-то. Заставь фигуру крутиться пока в одном направлении, при этом FI нужно взять равным константе, скажем 1. Тогда при каждом вызове функции поворота фигура должна поварачиваться на 1 градус.
1
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 16
23.01.2017, 01:54  [ТС]
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Ship::func2(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4, &x5, &y5, &x6, &y6, x7, y7, x8, y8)
{
        int x0=(X4+X1)/2;
        int y0=150;
 
       if(sost2==0)
  {     FI=1;
        X1=x0+((X1-x0)*cos(FI*M_PI/180)-(Y1-y0)*sin(FI*M_PI/180));
        X2=x0+((X2-x0)*cos(FI*M_PI/180)-(Y2-y0)*sin(FI*M_PI/180));
        X3=x0+((X3-x0)*cos(FI*M_PI/180)-(Y3-y0)*sin(FI*M_PI/180));
        X4=x0+((X4-x0)*cos(FI*M_PI/180)-(Y4-y0)*sin(FI*M_PI/180));
        X5=x0+((X5-x0)*cos(FI*M_PI/180)-(Y5-y0)*sin(FI*M_PI/180));
        X6=x0+((X6-x0)*cos(FI*M_PI/180)-(Y6-y0)*sin(FI*M_PI/180));
 
        Y1=y0+((X1-x0)*sin(FI*M_PI/180)+(Y1-y0)*cos(FI*M_PI/180));
        Y2=y0+((X2-x0)*sin(FI*M_PI/180)+(Y2-y0)*cos(FI*M_PI/180));
        Y3=y0+((X3-x0)*sin(FI*M_PI/180)+(Y3-y0)*cos(FI*M_PI/180));
        Y4=y0+((X4-x0)*sin(FI*M_PI/180)+(Y4-y0)*cos(FI*M_PI/180));
        Y5=y0+((X5-x0)*sin(FI*M_PI/180)+(Y5-y0)*cos(FI*M_PI/180));
        Y6=y0+((X6-x0)*sin(FI*M_PI/180)+(Y6-y0)*cos(FI*M_PI/180));
Теперь у меня ошибка, не знаю, что делать.
"E2449 Size of "func2" is unknown or zero" и "E2238 Multiple declaration for Ship::func2"
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.01.2017, 02:08
Лучший ответ Сообщение было отмечено Didelphidae как решение

Решение

Цитата Сообщение от Didelphidae Посмотреть сообщение
void Ship::func2(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4, &x5, &y5, &x6, &y6, x7, y7, x8, y8)
Верни как было.
Я всей душой надеялся увидеть что-нибудь вот такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
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);
}
при учете того, что типы всех X и Y будут double. Но и с int может прокатить - нужно проверять.
Я вот кстати сомневаюсь, что для любой твоей фигуры ось вращения имеет y=150. Да и вообще, задай x0 и y0 статическими значениями, например по центру экрана. Тогда твоя фигня должна вращаться вокруг этого центра.

Добавлено через 4 минуты
Ага, тут и ошибка всплыла. Новые значения координат нужно высчитывать через старые.
C++
1
2
3
4
5
6
void rotate2D(double &x, double &y, double x0, double y0, double phi) {
    double new_x=x0+(x-x0)*cos(phi*M_PI/180)-(y-y0)*sin(phi*M_PI/180);
    double new_y=y0+(x-x0)*sin(phi*M_PI/180)+(y-y0)*cos(phi*M_PI/180);
    x = new_x;
    y = new_y;
}
1
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 16
23.01.2017, 03:02  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Верни как было.
Вернула Сделала так, как у Вас в цитатах. Фигура начинает вращаться, а потом все координаты разъезжаются. Даже изначальной картины нет.
Миниатюры
Вращение фигуры вокруг собственной оси  
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.01.2017, 03:47
Цитата Сообщение от Didelphidae Посмотреть сообщение
Фигура начинает вращаться, а потом все координаты разъезжаются
int на double заменила? На сколько быстро проявляется расхождение?

Добавлено через 43 секунды
Да и вообще. Что-то поменяла - скидывай код заново.
1
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 16
23.01.2017, 10:33  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
int на double заменила? На сколько быстро проявляется расхождение?
Заменила. Сразу же, еле еле скриншот успела сделать, пока они совсем не разъехались

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void rotate2D(double &x, double &y, double x0, double y0, double phi) {
    int new_x=x0+(x-x0)*cos(phi*M_PI/180)-(y-y0)*sin(phi*M_PI/180);
    int new_y=y0+(x-x0)*sin(phi*M_PI/180)+(y-y0)*cos(phi*M_PI/180);
    x = new_x;
    y = new_y;
}
 
void Ship::func2()
{
        double x0=(X4+X1)/2;
        double y0= 150;
        double phi = 1.;
 
        rotate2D(X1, Y1, x0, y0, phi);
        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);
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.01.2017, 11:20
Цитата Сообщение от Didelphidae Посмотреть сообщение
int
Цитата Сообщение от Didelphidae Посмотреть сообщение
Заменила
Да неужели?
Можно еще попробовать абсолютный поворот:
Сейчас каждый кадр картинка немного поворачивается относительно предыдущей позиции. Реалии таковы, что ошибка, хоть и очень маленькая, постепенно накапливается.
Можно расчитывать позиция в абсолятных значениях:
у тебя есть начальные позиции точек, каждый кадр ты увеличиваешь угол поворота. И делаешь поворот изначальных точек (не меняя их самих) перед отрисовкой. (Это не то, что был у тебя в начале)

Добавлено через 3 минуты
Didelphidae, основная сейчас проблема - точность поворота.
Если где-то случайно отсавить int, то выйдет следующее. Точка у тебя посчиталась скажем 4.5, а округлив до int, получишь 4 - мы потеряли пол пикселя. Еще одна такая операция, и мы имеем уже целый пиксель потерь. Именно на этот пиксель у нас идет расхождение в картинке. Дальше - еще хуже.

Добавлено через 1 минуту
И замени вот это на константу.
Цитата Сообщение от Didelphidae Посмотреть сообщение
double x0=(X4+X1)/2;
Если (x0, y0) - это не центр твоей фигуры, то все у тебя пойдет в разнос, т.к. x0 будет меняться во времени - будет меняться ось вращения и вращения как такового не получится.
1
0 / 0 / 0
Регистрация: 31.05.2016
Сообщений: 16
23.01.2017, 22:25  [ТС]
Спасибо за помощь, преподавателя устроило и так.

Все-равно попробую доделать по-нормальному, выложу, если получится.
0
23.01.2017, 23:55

Не по теме:

Цитата Сообщение от Didelphidae Посмотреть сообщение
преподавателя устроило и так.
Плохой преподаватель, не люблю таких. Но я конечто рад, что больше ничего не нужно делать...

0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
12.09.2017, 13:45
Два способа поворота вокруг произвольной оси в 3д:
1)Матрица поворота вокруг произвольной оси в 3д.
Как развернуть одну из координат угла
2)Выражение матрицы поворота через кватернион.
Как развернуть одну из координат угла
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2017, 13:45
Помогаю со студенческими работами здесь

Осуществить вращение фигуры(квадрата) вокруг своей оси
Здравствуйте, пытаюсь написать алгоритм, который при зажимании мыши вращает квадрат вокруг своей оси. Почему то после полного вращения...

Вращение фигуры вокруг своей оси за курсором мыши
Всем доброго времени суток. Уже несколько недель бьюсь над данной задачей: как реализовать вращение фигуры за курсором мыши. Пробовал...

Вычислить объем тела полученного вращение фигуры вокруг заданной оси
Вычислить объем тела, полученного вращение фигуры Ф вокруг заданной оси: Ф: y=sinx, y=0, (0&lt;=x&lt;=Пи), Ox. Сделайте пожалуйста,...

Вращение планеты вокруг солнца, и вокруг своей оси
У меня есть Солнце, которое находиться в координатах(0.0.0), и нужно вращать планеты, как по орбите, и вокруг свой оси. Вот код двух...

Квадрат вращается вокруг собственной оси
ребята помогите! некак немогу понять как зделать чтоб квадрат вращалса вокруг своей оси, вот собствено квадрат uses GraphABC; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru