Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
4 / 4 / 5
Регистрация: 30.08.2012
Сообщений: 155
1

Движение по синусоиде

01.06.2015, 12:11. Показов 1810. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть вращающийся прямоугольник, как сделать так, чтобы он при этом еще и двигался по синусоиде? то что я написала почему-то не работает, вообще ничего не происходит

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include "math.h"
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int d=2; //скорость вращения
int n=0;//счётчик
int xx=100;
int yy=300;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  DoubleBuffered = 1;
  Timer1->Interval = 30;
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Timer1Timer(TObject *Sender) //вращение прямоугольника
{
  Refresh();
  static double angle = 0;
  rectangle(Canvas, clBlack, clPurple, 100, 300, 400, 100, angle++);
}
//---------------------------------------------------------------------------
 
 
void TForm1::rectangle(TCanvas * canvas, TColor pen_color, TColor brush_color, int x1, int y1, int x2, int y2, double angle)
{
  angle *= M_PI/180;
  canvas->Pen->Color = pen_color;
  canvas->Brush->Color = brush_color;
  int 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(center.x - r*cos(angle2 + angle), center.y + r*sin(angle2 + angle));
  canvas->LineTo(center.x + r*cos(angle2 - angle), center.y + r*sin(angle2 - angle));
  canvas->LineTo(center.x + r*cos(angle2 + angle), center.y - r*sin(angle2 + angle));
  canvas->LineTo(center.x - r*cos(angle2 - angle), center.y - r*sin(angle2 - angle));
  canvas->LineTo(center.x - r*cos(angle2 + angle), center.y + r*sin(angle2 + angle));
  canvas->FloodFill(center.x, center.y, canvas->Pixels[center.x][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;
}
//---------------------------------------------------------------------------
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2015, 12:11
Ответы с готовыми решениями:

Движение по синусоиде
Разработать программу, моделирующую движение шарика по синусоиде. При ударе о стену шарик должен...

Движение по синусоиде
Подскажите, пожалуйста, как реализовать движение спрайта по синусоиде? Сейчас движется только...

Движение спрайта по синусоиде
Подскажите, пожалуйста, как реализовать движение спрайта по синусоиде? Сейчас движется только...

Вращение и движение по синусоиде звезды
Нужно нарисовать такую фигурку. что бы она двигалась по синусоиде и вращалась вокруг центра(((...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32836 / 21173 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
01.06.2015, 12:25 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
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
   xx+=d;
   yy = (int)(sin(xx/10.)*(Form1->Height/10)+(Form1->Height/2)); // Внимательно!!! Там точка добавлена
   Form1->Timer2->Interval = 40;
}
//---------------------------------------------------------------------------
 
void TForm1::rectangle(TCanvas * canvas, TColor pen_color, TColor brush_color, int x1, int y1, int x2, int y2, double angle)
{
  angle *= M_PI/180;
  canvas->Pen->Color = pen_color;
  canvas->Brush->Color = brush_color;
  int 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);
}
1
случайный прохожий
2939 / 1954 / 607
Регистрация: 20.07.2013
Сообщений: 5,172
01.06.2015, 21:46 3
Можно изменить функцию так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// новая функция
void rectangle2(TCanvas *canvas, TColor pen_color, TColor brush_color, TPoint center, int width, int height, double angle)
{
  angle *= M_PI/180;
  canvas->Pen->Color = pen_color;
  canvas->Brush->Color = brush_color;
  int r = sqrt(width * width / 4 + height * height / 4);
  double angle2 = atan(1.*height / width);
  canvas->MoveTo(center.x - r*cos(angle2 + angle), center.y + r*sin(angle2 + angle));
  canvas->LineTo(center.x + r*cos(angle2 - angle), center.y + r*sin(angle2 - angle));
  canvas->LineTo(center.x + r*cos(angle2 + angle), center.y - r*sin(angle2 + angle));
  canvas->LineTo(center.x - r*cos(angle2 - angle), center.y - r*sin(angle2 - angle));
  canvas->LineTo(center.x - r*cos(angle2 + angle), center.y + r*sin(angle2 + angle));
  canvas->FloodFill(center.x, center.y, canvas->Pixels[center.x][center.y], fsSurface);
}
и получить более простую / разнообразную возможность движения (перемещения), см. комментарии
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Refresh();
  static double angle = 0, x = 250, y = 200, radius = 15, period = 2.5;
//  rectangle(Canvas, clBlack, clBlue, 100, 300, 400, 100, angle++);  // вращение без перемещения ("старая" функция)
//  rectangle2(Canvas, clBlack, clBlue, TPoint(x, y), 300, 200, angle++);  // такое же вращение без перемещения
//  rectangle2(Canvas, clBlack, clBlue, TPoint(x++, y++), 300, 200, angle++);  // вращение с движением по наклонной линии
  rectangle2(Canvas, clBlack, clBlue, TPoint(x++, y+radius*sin(angle/period)), 300, 200, angle++);  // по синусоиде
//  rectangle2(Canvas, clBlack, clBlue, TPoint(x+radius*cos(angle/period), y+radius*sin(angle/period)), 300, 200, angle++);  // по окружности
}
1
01.06.2015, 21:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2015, 21:46
Помогаю со студенческими работами здесь

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

Движение колобка по синусоиде
написать программу,где колобок катится по синусоиде искал на форуме,нашел (...

Движение обьекта по синусоиде
В моей программе содержится обьект который создается и перемещается по заданным координатам. А по...

Движение окружности по синусоиде
Построить анимацию для окружности, передвигающейся по синусоиде. Радиус окружности равен 3, центр...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru