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

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

08.12.2014, 15:53. Показов 17228. Ответов 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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
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
Просмотров: 1167

Размер: 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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru