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

Движение графического объекта по траектории, вращение, изменение цвета

08.12.2014, 15:53. Показов 17277. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста!
У меня задача:1) нарисовать фугуру (звезда в круге). (С этим я справлюсь.)
2) реализовать движение по траектории (дуга) и одновременное вращение вокруг своей оси, скорость движения и вращения задается пользователем
3) при вращении и движении фигура плавно менят цвет
4) После касания фигуры границ рабочей области она прекращает свое движение и через интервал времени t начинает движение в обратном направлении
5) Также необходимо реализовать возможность маштабирования фигуры и возвращение к исходному маштабу

Где можно посмотреть что-нибудь похожее, какие- нибудь примеры
Я буду реализовывать в c++ builder, но если есть примеры на delphi и им буду рада.
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.12.2014, 15:53
Ответы с готовыми решениями:

Движение графического объекта по траектории и его вращение
Помогите!!! Нужно нарисовать фигуру и задать движение. Начальное направление задается в виде вектора перемещения. При касании границы...

движение графического объекта
привет всем.собственно,проблема : при нажатии мышкой в любом месте формы некий графический объект(далее как г\о),будь то Image, Rect или...

Движение фигуры по заданной траектории с вращением и изменением цвета
Здравствуйте, кому не сложно помогите пожалуйста. Нужно написать графическое приложение движения фигуры по заданной траектории. При...

21
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
09.12.2014, 09:05
Восход солнца на море
2
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
09.12.2014, 19:28
cpp:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cspin"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
int dir = 1;  // напрвление движение
long int color = 0;  // цвет объекта
double scale = 1;  // масштаб объекта
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// функция для отрисовки звезды в окружности
void TForm1::star_in_circle (TPoint center, int outer_radius, int inner_radius, int beam_count, double scale, TColor color, double angle)
{
  // center - центр фигуры
  // outer_radius и inner_radius - внешний (окружность) и внутр. радиусы (на этой окружности лежат основания лучей)
  // beam_count - кол-во лучей, scale - масштаб
  // color - цвет фигуры
  // angle - угол (поворота / наклона лучей звезды)
 
  Refresh();
 
  // применяем масштаб
  outer_radius *= scale;
  inner_radius *= scale;
 
  // рисуем окружность
  Canvas->Pen->Color = color;
  Canvas->Ellipse(center.x - outer_radius, center.y - outer_radius, center.x + outer_radius + 1, center.y + outer_radius + 1);
 
  // переходим в "начальную точку" звезды
  Canvas->MoveTo(center.x+sin(angle)*outer_radius, center.y-cos(angle)*outer_radius);
  // рисуем лучи
  for (int i = 1; i <= beam_count; i++)
  {
    Canvas->LineTo(center.x+sin(angle+(i*2-1)*M_PI/beam_count)*inner_radius, center.y-cos(angle+(i*2-1)*M_PI/beam_count)*inner_radius);
    Canvas->LineTo(center.x+sin(angle+i*2*M_PI/beam_count)*outer_radius, center.y-cos(angle+i*2*M_PI/beam_count)*outer_radius);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/*  Tag = 0;
  Timer1->Tag = 0;
  dir = 1;
  color = 0;
  scale = StrToFloatDef(EditScale1->Text, 1) / StrToFloatDef(EditScale2->Text, 1);
*/
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  // скорость движения и масштаб
  Timer1->Interval = CSpinEditMovingSpeed->MaxValue - CSpinEditMovingSpeed->Value + 1;
  scale = StrToFloatDef(EditScale1->Text, 1) / StrToFloatDef(EditScale2->Text, 1);
 
//  начальные значения
//  Timer1->Interval = 10 и Timer1->Enabled = 1
//  Timer2->Interval = 0 и Timer1->Enabled = 0
//  ClientHeight = 500, ClientWidth = 1000
//  CSpinEditMovingSpeed->Value = 90, CSpinEditRotatingSpeed->Value = 10, CSpinEditTimeToChangeDirection->Value = 0
//  CSpinEditMovingSpeed->MaxValue = 100
//  CSpinEditMovingSpeed->MinValue = 1
//  CSpinEditRotatingSpeed->MaxValue = 100
//  CSpinEditRotatingSpeed->MinValue = 1
//  CSpinEditTimeToChangeDirection->MaxValue = 5
//  CSpinEditTimeToChangeDirection->MinValue = 0
 
  // задаем радиусы и кол-во лучей
  int outer_radius = 110, inner_radius = 45, beam_count = 7;
  // задаем кординаты центра фигуры
  int x = Tag+outer_radius*scale, y = -100*sin(Tag*180./ClientWidth/15/M_PI)+ClientHeight-outer_radius*scale-1;
 
  // фигура строится вначале в левом нижнем углу, туда и возвращается (поэтому проверка ниже упрощена)
  star_in_circle(TPoint(x, y), outer_radius, inner_radius, beam_count, scale, TColor(RGB(color*1, color*15, color*254)), Timer1->Tag*180./M_PI/ClientWidth/50*CSpinEditRotatingSpeed->Value);
 
  // проверка на достижение фигурой границ формы
  if (((x+outer_radius*scale >= ClientWidth || y-outer_radius*scale <= 0 || y+outer_radius*scale >= ClientHeight) && dir > 0) || (x-outer_radius*scale <= 0 && dir < 0))
  {
    // меняем направление движения
    dir *= -1;
    Timer1->Enabled = 0;
    // задаем время, через которое фигура начнет двигаться в другую сторону
    Timer2->Interval = CSpinEditTimeToChangeDirection->Value*1000 + 1;
    Timer2->Enabled = 1;
  }
  // смещаем фигуру
  Tag += dir;
  // если нужно менять и направление вращения, то замени Timer1->Tag выше (идет "построение" фигуры) на Tag
  // Timer1->Tag тогда не нужен
  Timer1->Tag++;
  // изменяем цвет
  color++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
  Timer2->Enabled = 0;
  Timer1->Enabled = 1;
}
//---------------------------------------------------------------------------
h:
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include "cspin.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TTimer *Timer1;
    TCSpinEdit *CSpinEditMovingSpeed;
    TLabel *LabelMovingSpeed;
    TCSpinEdit *CSpinEditRotatingSpeed;
    TLabel *LabelRotatingSpeed;
    TTimer *Timer2;
    TCSpinEdit *CSpinEditTimeToChangeDirection;
    TLabel *LabelTimeToChangeDirection;
    TLabel *LabelScale;
    TEdit *EditScale1;
    TEdit *EditScale2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall Timer2Timer(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    void star_in_circle (TPoint center, int outer_radius, int inner_radius, int beam_count, double scale, TColor color, double angle);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Вложения
Тип файла: zip star_in_circle.zip (59.6 Кб, 191 просмотров)
4
9 / 2 / 0
Регистрация: 08.12.2014
Сообщений: 11
10.12.2014, 22:54  [ТС]
Спасибо вам огромное, gunslinger.
В чем может быть дело(когда программа запущена): когда я устанавливаю скорость движения на положительное число фигура останавливается.
При изменении скорости вращения, время паузы и маштаба фигура меняется и двигается

А еще, в прикреленном файле моя фигура по заданию, я хочу нарисовать линии между лучами:

C++
1
2
3
4
5
6
7
8
 for (int i = 1; i <= beam_count; i++)
  {
  TPoint PenPos;
    Canvas->LineTo(center.x+sin(angle+(i*2-1)*M_PI/beam_count)*inner_radius, center.y-cos(angle+(i*2-1)*M_PI/beam_count)*inner_radius);
    Canvas->PenPos;// PenPos текущая координата линии
    Canvas->LineTo(center.x+sin(angle+i*2*M_PI/beam_count)*outer_radius, center.y-cos(angle+i*2*M_PI/beam_count)*outer_radius);
    Canvas->LineTo(PenPos.X, PenPos.Y);
  }
Выдает ошибку в Canvas->LineTo(PenPos1, PenPos2); о преобразовании типов, и может PenPos измениться после отрисовки второго луча: Canvas->LineTo(center.x+sin(angle+i*2*M_PI/beam_count)*outer_radius, center.y-cos(angle+i*2*M_PI/beam_count)*outer_radius); и я не правильно делаю, помогите пожалуйста.
Миниатюры
Движение графического объекта по траектории, вращение, изменение цвета  
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
11.12.2014, 00:06
Скорость движения не может быть меньше 1. Если значение мало, то фигура просто может очень медленно двигаться, но не останавливается.
При изменении значений (так задано в программе) движение и вращение продолжается.
Если это не устраивает, добавь кнопку, по нажатию на которую применяются новые значения. А также вынеси использование значений не в таймер. Я думал, что проще так, как сделал.
Программирование должно приносить удовольствие, а подстраиваться под изменяющееся задание нет желания (подсказка дана, вперед и с песней, настраивай код, как захочется).
Насчет линий чуть ниже скажу.
По рисунку: inner_radius должен быть в 2 раза меньше, чем outer_radius.
beam_count задай равным 6.
Остальное оставлю тебе (код по начальным условиям сделан, по новым уже не интересно, то же самое, но в профиль; основная часть готова, подпиливание оставлю тебе для того, чтобы хоть что-то отложилось в голове).
Вижу противоречие - дуга идет от одного угла формы до другого, а движение (и т. д.) меняется после касания фигурой границ. Это как понимать?
Возвращаюсь к линиям.
C++
1
2
3
4
5
6
7
  for (int i = 1; i <= beam_count; i++)
  {
    Canvas->LineTo(center.x+sin(angle+(i*2-1)*M_PI/beam_count)*inner_radius, center.y-cos(angle+(i*2-1)*M_PI/beam_count)*inner_radius);
    Canvas->LineTo(center.x+sin(angle+(i*2-3)*M_PI/beam_count)*inner_radius, center.y-cos(angle+(i*2-3)*M_PI/beam_count)*inner_radius);
    Canvas->MoveTo(center.x+sin(angle+(i*2-1)*M_PI/beam_count)*inner_radius, center.y-cos(angle+(i*2-1)*M_PI/beam_count)*inner_radius);
    Canvas->LineTo(center.x+sin(angle+i*2*M_PI/beam_count)*outer_radius, center.y-cos(angle+i*2*M_PI/beam_count)*outer_radius);
  }
Название: 886c95e15fa6d39a4884338eec8517f6.jpg
Просмотров: 1169

Размер: 8.3 Кб
2
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 1
20.03.2015, 22:09
исходник остался, плиз?
0
9 / 2 / 0
Регистрация: 08.12.2014
Сообщений: 11
21.03.2015, 21:36  [ТС]
Товарищ, вы случайно не в ВГТУ учитесь на заочном сокр.)?
В исходнике цвет реализован не так как описано выше.
program.rar
0
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
22.03.2015, 16:17
Исходник выше.
Я уже давно (почти 12 лет назад) отучился (в ТулГУ на очном), если вопрос адресован мне.
Задание сделано по тем данным, которые были. Так что изменяй код, если требуется.
И пост №5 вроде никуда не исчез.
0
9 / 2 / 0
Регистрация: 08.12.2014
Сообщений: 11
22.03.2015, 18:29  [ТС]
Я извиняюсь, вопрос был не вам, а lex1212, видимо не тому ответила
0
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 33
22.12.2015, 14:43
я извиняюсь а есть исходник работающий ????
0
9 / 2 / 0
Регистрация: 08.12.2014
Сообщений: 11
23.12.2015, 21:27  [ТС]
Есть: ishodnik.rar
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 3
02.01.2016, 17:01
вы не могли бы скинуть свой исходник этой программы?
0
9 / 2 / 0
Регистрация: 08.12.2014
Сообщений: 11
02.01.2016, 20:12  [ТС]
Исходник выложен. (ishodnik.rar)
1
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 2
06.03.2016, 20:21
Здравствуйте! попытался открыть ваш исходник, но он выдал ошибку: "точка входа в процедуру не найдена в библиотеке acntBCB_R.bpl. не можете подсказать в чем причина?
0
16 / 10 / 6
Регистрация: 15.10.2013
Сообщений: 208
12.01.2017, 10:31
Спасибо, gunslinger, доработал ваш код по своему условию)
Миниатюры
Движение графического объекта по траектории, вращение, изменение цвета   Движение графического объекта по траектории, вращение, изменение цвета  
Вложения
Тип файла: rar Star In Circle.rar (849.2 Кб, 86 просмотров)
1
16 / 10 / 6
Регистрация: 15.10.2013
Сообщений: 208
28.02.2017, 23:56
Вот исходник, если кому нужен. https://yadi.sk/d/-0eJpBNG3EpHTi
0
2 / 0 / 1
Регистрация: 11.01.2016
Сообщений: 34
31.01.2018, 23:00
Доброго времени суток. Возможно, где-то уже есть ответ. Подскажите пожалуйста, как надо изменить код, чтобы фигура(звезда в круге) двигалась по синусоиде. Буду очень признателен.

С уважением, господа форумчане.
Реализация в Embarcadero Builder 10.2
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
//---------------------------------------------------------------------------
 //Перерисовать круг в прямоугольник
#include <vcl.h>
#pragma hdrstop
 
#include "main.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cspin"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
int dir = 1;  // напрвление движение
long int color = 0;  // цвет объекта
double scale = 1;  // масштаб объекта
int d=2; //скорость вращения
int n=0;//счётчик
int xx=100;
int yy=300;
 
//пример из первоисточника
const double sqrt2 = 1.41421356237; //хз че за переменная, посмотрим
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// функция для отрисовки звезды в квадрате
void TForm1::star_in_circle (TPoint center, int outer_radius, int inner_radius, int beam_count, double scale, TColor color, double angle)
{
  // center - центр фигуры
  // outer_radius и inner_radius - внешний (квадрат) и внутр. радиусы (на этой окружности лежат основания лучей)
  // beam_count - кол-во лучей, scale - масштаб
  // color - цвет фигуры
  // angle - угол (поворота / наклона лучей звезды)
 
  Refresh();
 
  // применяем масштаб
  outer_radius *= scale;
  inner_radius *= scale;
 
  // рисуем квадрат
  Canvas->Brush->Color = clGreen;
  Canvas->Pen->Color = color;
  int Width = center.x + inner_radius + 1;
  Canvas->Rectangle(center.x - inner_radius, center.y - inner_radius, Width/*center.x + inner_radius + 1*/, center.y + inner_radius + 1);
  Canvas->Rectangle(center.x - outer_radius, center.y - outer_radius, center.x + outer_radius + 1, center.y + outer_radius + 1);
 
  // переходим в "начальную точку" звезды
  Canvas->MoveTo(center.x+sin(angle)*outer_radius, center.y-cos(angle)*outer_radius);
  // рисуем лучи
  for (int i = 1; i <= beam_count; i++)
  {
    Canvas->LineTo(center.x+sin(angle+(i*2-1)*M_PI/beam_count)*inner_radius, center.y-cos(angle+(i*2-1)*M_PI/beam_count)*inner_radius);
    Canvas->LineTo(center.x+sin(angle+i*2*M_PI/beam_count)*outer_radius, center.y-cos(angle+i*2*M_PI/beam_count)*outer_radius);
  }
 
}
//---------------------------------------------------------------------------
//удалить если не надо
double way(double x)  // траектория движения
{
  return sin(x/180*M_PI);
}
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 
    // Timer1->Interval = 100;
// Timer1->Enabled = 1;
 
 
    // скорость движения и масштаб
  Timer1->Interval = CSpinEditMovingSpeed->MaxValue - CSpinEditMovingSpeed->Value + 1;
  scale = StrToFloatDef(EditScale1->Text, 1) / StrToFloatDef(EditScale2->Text, 1);
 
//  начальные значения
//  Timer1->Interval = 10 и Timer1->Enabled = 1
//  Timer2->Interval = 0 и Timer1->Enabled = 0
//  ClientHeight = 500, ClientWidth = 1000
//  CSpinEditMovingSpeed->Value = 90, CSpinEditRotatingSpeed->Value = 10, CSpinEditTimeToChangeDirection->Value = 0
//  CSpinEditMovingSpeed->MaxValue = 100
//  CSpinEditMovingSpeed->MinValue = 1
//  CSpinEditRotatingSpeed->MaxValue = 100
//  CSpinEditRotatingSpeed->MinValue = 1
//  CSpinEditTimeToChangeDirection->MaxValue = 5
//  CSpinEditTimeToChangeDirection->MinValue = 0
 
  // задаем радиусы и кол-во лучей
  int outer_radius = 110, inner_radius = 45, beam_count = 8;
  // задаем кординаты центра фигуры
  int x = Tag+outer_radius*scale, y = -100*sin(Tag*180./ClientWidth/15/M_PI)+ClientHeight-outer_radius*scale-1;
 
  // фигура строится вначале в левом нижнем углу, туда и возвращается (поэтому проверка ниже упрощена)
  star_in_circle(TPoint(x, y), outer_radius, inner_radius, beam_count, scale, TColor(RGB(color*1, color*15, color*254)), Timer1->Tag*180./M_PI/ClientWidth/50*SpinEditRotatingSpeed->Value);
 
// проверка на достижение фигурой границ формы
  if (((x+outer_radius*scale >= ClientWidth || y-outer_radius*scale <= 0 || y+outer_radius*scale >= ClientHeight) && dir > 0) || (x-outer_radius*scale <= 0 && dir < 0))
  {
    // меняем направление движения
    dir *= -1;
    Timer1->Enabled = 0;
    // задаем время, через которое фигура начнет двигаться в другую сторону
    Timer2->Interval = CSpinEditTimeToChangeDirection->Value*1000 + 1;
    Timer2->Enabled = 1;
  }
  // смещаем фигуру
  Tag += dir;
  // если нужно менять и направление вращения, то замени Timer1->Tag выше (идет "построение" фигуры) на Tag
  // Timer1->Tag тогда не нужен
  Timer1->Tag++;
 
 
  // изменяем цвет
  color++;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 /*  Tag = 0;
  Timer1->Tag = 0;
  dir = 1;
  color = 0;
  scale = StrToFloatDef(EditScale1->Text, 1) / StrToFloatDef(EditScale2->Text, 1);
*/
}
//---------------------------------------------------------------------------
void TForm1::rectangle(TCanvas * canvas, TColor pen_color, TColor brush_color, int x1, int y1, int x2, int y2, double angle)
{
/* double half_difx, half_dify, r;
  angle *= M_PI/180;
  canvas->Pen->Color = pen_color;
  canvas->Brush->Color = brush_color;
  half_difx = abs(x2-x1)/2, half_dify = abs(y2-y1)/2, r = sqrt(half_difx * half_difx + half_dify * half_dify);
  int minx = x1 < x2 ? x1 : x2, miny = y1 < y2 ? y1 : y2;
  TPoint center = TPoint(minx+half_difx, miny+half_dify);
  double angle2 = atan(1.*half_dify / half_difx);                                                   */
//  canvas->MoveTo((xx-100)+center.x - r*cos(angle2 + angle), yy/*center.y*/ + r*sin(angle2 + angle));
//  canvas->LineTo((xx-100)+center.x + r*cos(angle2 - angle), yy/*center.y*/ + r*sin(angle2 - angle));
//  canvas->LineTo((xx-100)+center.x + r*cos(angle2 + angle), yy/*center.y*/ - r*sin(angle2 + angle));
//  canvas->LineTo((xx-100)+center.x - r*cos(angle2 - angle), yy/*center.y*/ - r*sin(angle2 - angle));
//  canvas->LineTo((xx-100)+center.x - r*cos(angle2 + angle), yy/*center.y*/ + r*sin(angle2 + angle));
//  canvas->FloodFill((xx-100)+center.x, yy/*center.y*/, canvas->Pixels[(xx-100)+center.x][yy/*center.y*/], fsSurface);
 
  }
 
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
    xx+=d;
   yy = (int)(sin(xx/10.)*(Form1->Height/10)+(Form1->Height/2)); // Внимательно!!! Там точка добавлена
 
   Form1->Timer2->Interval = 40;
  Timer2->Enabled = 0;
  Timer1->Enabled = 1;
}
//---------------------------------------------------------------------------
0
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
01.02.2018, 01:49
Изначально движение и происходило по синусоиде (код из поста №3).
Для большей наглядности строку №82 кода оттуда можно немного изменить.
Было:
C++
1
  int x = Tag+outer_radius*scale, y = -100*sin(Tag*180./ClientWidth/15/M_PI)+ClientHeight-outer_radius*scale-1;
Стало:
C++
1
  int x = Tag+outer_radius*scale, y = -100*sin(Tag*180./ClientWidth/1.5/M_PI)+0.75*ClientHeight-outer_radius*scale-1;
Скриншот с траекторией движения ниже; для получения подобного изображения нужно убрать (закомментировать) из кода строку с
C++
1
  Refresh();
Миниатюры
Движение графического объекта по траектории, вращение, изменение цвета  
0
0 / 0 / 0
Регистрация: 06.04.2020
Сообщений: 2
06.04.2020, 20:35
Уважаемый, а можно ваш исходник ?
0
16 / 10 / 6
Регистрация: 15.10.2013
Сообщений: 208
06.04.2020, 22:16
https://yadi.sk/d/ZI1SCiLVkNcZxQ
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2020, 22:16
Помогаю со студенческими работами здесь

Движение объекта по траектории
Доброго времени суток! У меня следующая ситуация. На форме отрисоввывается несколько объектов со своими координатами. как мне...

Движение круга по заданной траектории со сменой цвета
Помогите сделать анимацию задание: Слева направо на экране по косинусоидальной( если не понятное слово то в оригинале звучит так - ...

Движение объекта по круговой траектории
Задача: сделать так, чтобы предмет двигался по круговой траектории, но можно было регулировать скорость объекта. Как сделать этот...

Движение объекта по заданной траектории
Здравствуйте, мне (совсем новичку) была поставлена задача реализовать движение прямоугольника по заданной траектории (координатам), т.е....

Движение объекта по заданной траектории
помогите, как сделать чтоб прямоугольник двигался по прямоугольной траектории? Добавлено через 23 часа 27 минут :help:


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru