Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/130: Рейтинг темы: голосов - 130, средняя оценка - 4.55
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94

Рисование на Canvas (движения фигуры)

31.05.2012, 04:11. Показов 25080. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем приветики! помогите с задачкой:

Создать программу(оболочку) для отображения движения фигуры в виде звезды по кругу с помощью класса Canvas(функции Pen, Brush, Rectangle)
формы From1 при нажатии на кнопку "Выполнить". Использовать компонент Timer и функцию Timer1->Timer


Рисовать надо в Borland C++ Builder 6 или Borland Turbo C++ 2006

Заранее спасибки)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2012, 04:11
Ответы с готовыми решениями:

Рисование концентрической фигуры - внутри другой фигуры
Здравствуйте. Подскажите с решением. Суть такая. На листе есть замкнутая ломаная линия. Как нарисовать концентрическую фигуру...

Рисование Canvas
вот написал код который рисует мышкой,все хорошо,но есть одна проблема,когда быстро вожу мышкой то не успевает каждую координату...

Рисование в canvas
Здравствуйте. Есть задание в котором нужно нарисовать красный квадрат с закругленными краями и в этом квадрате должен быть нарисован белый...

13
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
31.05.2012, 04:25
1. Краткое руководство по работе с классом TCanvas для начинающих
2. Закрашеная звезда
3. Звездочка
4. движение картинки

Движение шарика по прямой и по эллипсу.

Пример 1.
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x,y;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  PaintBox1->Canvas->Ellipse(x,y,x+50,y+50);
  PaintBox1->Canvas->Pen->Color=clBlack;
  x++;
  y++;
  PaintBox1->Canvas->Ellipse(x,y,x+50,y+50);
  PaintBox1->Canvas->Pen->Color=clBtnFace;
  if(x>PaintBox1->Width) {
    x=PaintBox1->Left;
    y=PaintBox1->Top;
  }
  if(y>PaintBox1->Height) {
    y=PaintBox1->Top;
    x=PaintBox1->Left;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  x=PaintBox1->Left;
  y=PaintBox1->Top;
  Form1->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Form1->Timer1->Enabled=false;        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  Form1->Timer1->Enabled=true;        
}
Пример 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
#include "math.h"
...
int x,y;
int a,b,cntrx,cntry;
double alpha;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  PaintBox1->Canvas->Pen->Color=clBtnFace;
  PaintBox1->Canvas->Ellipse(x-25,y-25,x+25,y+25);
  x = cntrx + floor(a*cos(alpha));
  y = cntry + floor(b*sin(alpha));
  PaintBox1->Canvas->Pen->Color=clBlack;
  PaintBox1->Canvas->Ellipse(x-25,y-25,x+25,y+25);
  alpha += 0.1;
  if (alpha >= 2*M_PI)
    alpha = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  x = PaintBox1->Width/2;
  y = PaintBox1->Height/3;
  a = 100;
  b = 100;
  alpha = 0;
  cntrx = PaintBox1->Width/2;
  cntry = PaintBox1->Height/2;
  Form1->Timer1->Enabled = true;
}
C++
1
2
3
// Как сделать, чтобы в центре этой анимации
// был неподвижный шарик?
PaintBox1->Canvas->Ellipse(cntrx-25,cntry-25,cntrx+25,cntry+25);
пример не мой
консультации и техническая поддержка не предоставляются
1
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
31.05.2012, 05:42  [ТС]
Спасибо LK
Сейчас попробую сделать...

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
#include <math.h>
TForm1 *Form1;
int x,y,a,b,cntrx,cntry;
double alpha;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 // Graphics::TBitmap *Background = new Graphics::TBitmap;     // ôîí
  //Graphics::TBitmap *buff = new Graphics::TBitmap;      // áóôåð
 
  x = Form1->Width/2;
  y = Form1->Height/3;
  a = 100;
  b = 100;
  alpha = 0;
  cntrx = Form1->Width/2;
  cntry = Form1->Height/2;
  Form1->Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Form1->Canvas->Pen->Color=clBtnFace;
  Form1->Canvas->Rectangle(x-25,y-25,x+25,y+25);
  x = cntrx + floor(a*cos(alpha));
  y = cntry + floor(b*sin(alpha));
  Form1->Canvas->Pen->Color=clBlack;
  Form1->Canvas->Rectangle(x-25,y-25,x+25,y+25);
 /* alpha += 0.1;
  if (alpha >= 2*M_PI)
    alpha = 0;    */
}
//---------------------------------------------------------------------------
Добавлено через 37 минут
Вот, сделала, чтобы звёздочку рисовала функция star

C++
1
2
3
4
5
6
7
8
void __fastcall star(int x, int y)  
{
  int r=30, n = 5, m = 2;
  const float pi=3.1415926;
  Form1->Canvas->MoveTo(x + r, y);
  for(int i=1; i<=n; i++)
    Form1->Canvas->LineTo(x + cos(i*m*pi*2/n) * r, y + sin(i*m*pi*2/n) * r);
}
А как сделать, чтобы она двигалась по кругу?

P.S. Просто не догоняю что-то, как это сделать...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
31.05.2012, 05:58
В 2х-мерном пространстве:
x = r*cos(a) + u; y = r*sin(a) + v, где r - радиус, a - угол, (u,v) - координаты центра окружности.
Графика и анимация (Шамис)
Вложения
Тип файла: pdf Программирование в C++ Builder.pdf (1.31 Мб, 335 просмотров)
1
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
31.05.2012, 06:36  [ТС]
что то не получается ...

пишу так
C++
1
2
3
4
5
6
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  int x = 30 * cos(a) + 50; 
  int y = 30 * sin(a) + 50;
  star(x, y);
}
звезда рисуется в (50, 50) но стоит на месте(((

Добавлено через 4 минуты
и ещё:
я первой строчкой в функции star пишу Form1->Canvas->FillRect(Form1->Canvas->ClipRect);
чтобы очищать форму перед рисованием звезды

Добавлено через 16 минут
даже так не получается анимацию создать
C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //Timer1->Enabled = true;
  for(int i = 1; i < 10; i++)
  star(i + 15, i + 20);
}
P.S. LK, в книжке про анимацию написано, как ещё воспроизводить с помощью avi...

Добавлено через 4 минуты
скажите, что надо подправить в коде, чтобы получилась анимация?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall star(int x, int y)  
{
  int r=30, n = 5, m = 2;
  const float pi=3.1415926;
  Form1->Canvas->MoveTo(x + r, y);
  for(int i=1; i<=n; i++)
    Form1->Canvas->LineTo(x + cos(i*m*pi*2/n) * r, y + sin(i*m*pi*2/n) * r);
}
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  int x = 30 * cos(10) + 50; 
  int y = 30 * sin(10) + 50;
  star(x, y);
}
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
31.05.2012, 07:06
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  static double angle = 0.0;
  int x = 30 * cos( angle ) + 50; 
  int y = 30 * sin( angle ) + 50;
  star(x, y);
  angle += 0.1;
}
1
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
31.05.2012, 07:11  [ТС]
BRcr, спасибо)) но я уже сделала, правда немного по другому))

Если вам не сложно, то можете сделать такое: движение квадрата по траектории в виде прямоугольника? задача, аналогичная этой, только я не знаю, как сделать, чтобы квадрат двигался по квадратной траектории....
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
31.05.2012, 08:05
Квадрат, полагаю, как рисовать вместо окружности догадываемся?
Вот примерно функция движения по периметру прямоугольника:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
    Rect bounds(30, 30, 70, 90);
    static int x = bounds.left, y = bounds.top, step = 1;
    static int *one_to_change = &x, *fringe = &bounds.right;
    
    if (*one_to_change > *fringe) {
        one_to_change = (one_to_change == &x ? &y: &x);
        fringe = ( (fringe == &bounds.right) ? &bounds.bottom: ( (fringe == &bounds.bottom) ? &bounds.left: 
                ( (fringe == &bounds.left) ? &bounds.top: &bounds.right)));
        ( (fringe == &bounds.left) || (fringe == &bounds.right) ) ? step = -step: step;
    }
    square(x, y);
    *one_to_change += step;
}
Добавлено через 7 минут
Оп-па, пардон... поправка на ветер:
C++
1
    if (( (fringe == &bounds.left) || (fringe == &bounds.top) ) ? (*one_to_change < *fringe): (*one_to_change > *fringe) ) {
1
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
31.05.2012, 13:36  [ТС]
В обработчике таймера сделал такой код
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
int x, y; //размеры прямоугольника
int d;  //шаг
int size; //размер квадрата
int current_x, current_y;
int way_x, way_y; //размеры прямоугольника
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  x = 100, y = 200; //размеры прямоугольника
  d = 2;  //шаг
  size = 30; //размер квадрата
  current_x = 100, current_y = 200;
  way_x = 100, way_y = 200; //размеры прямоугольника
  Form1->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Form1->Canvas->Pen->Color=clBlack;
 // Form1->Canvas->Rectangle(current_x, current_y, current_x + size,current_y + size);
  if(current_x < way_x && current_y < way_y)
  {
    Form1->Canvas->Rectangle(current_x + d, current_y, current_x + size + d,current_y + size);
    current_x += d;
    current_y += d;
  }
  else
    if(current_x > way_x && current_y < way_y)
    {
      Form1->Canvas->Rectangle(current_x, current_y + d, current_x + size,current_y + size + d);
      current_x += d;
      current_y -= d;
    }
    else
      if(current_x > way_x && current_y > way_y)
      {
        Form1->Canvas->Rectangle(current_x - d, current_y, current_x + size - d,current_y + size);
        current_x -= d;
        current_y -= d;
      }
      else
        if(current_x < way_x && current_y > way_y)
        {
          Form1->Canvas->Rectangle(current_x, current_y - d, current_x + size,current_y + size - d);
          current_x -= d;
          current_y += d;
        }
}
но он почему то не рисует квадрат....

Добавлено через 10 минут
Цитата Сообщение от BRcr Посмотреть сообщение
Вот примерно функция движения по периметру прямоугольника:
а что движется по ней?
не могли бы вы свой проект скинуть

Добавлено через 2 минуты
Цитата Сообщение от BRcr Посмотреть сообщение
square(x, y);
А это что за функция?

Добавлено через 3 минуты
Цитата Сообщение от BRcr Посмотреть сообщение
Вот примерно функция движения по периметру прямоугольника:
Квадрат стоит на месте, как мёртвый!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    TRect bounds(30, 30, 70, 90);
    static int x = bounds.left, y = bounds.top, step = 1;
    static int one_to_change = x, fringe = bounds.right;
    
    if (( (fringe == bounds.left) || (fringe == bounds.top) ) ? (one_to_change < fringe): (one_to_change > fringe) ) {
        one_to_change = (one_to_change == x ? y: x);
        fringe = ( (fringe == bounds.right) ? bounds.bottom: ( (fringe == bounds.bottom) ? bounds.left:
                ( (fringe == bounds.left) ? bounds.top: bounds.right)));
        ( (fringe == bounds.left) || (fringe == bounds.right) ) ? step = -step: step;
    }
    Form1->Canvas->Rectangle(x, y, x + size, y + size);
   // square(x, y);
    one_to_change += step;
Добавлено через 44 минуты
А можете подсказать уравнение квадрата?

Добавлено через 3 часа 14 минут
Всё! Задача решена и тема закрыта! Всем спасибки!
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
31.05.2012, 14:41
square(x, y) - это по аналогии со star(x, y), думал, это очевидно.

И если проблема решена, здесь принято делиться решением. Может, еще кому-то понадобится сделать подобное.
1
 Аватар для Ксю92
73 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 94
31.05.2012, 16:07  [ТС]
BRcr, окай, сейчас выложу)
Правда что я сделала - это перевела решение с Delphi на С++ Builder)
Решение тут Квадрат по прямоугольнику и ромб по восьмиугольнику
сама задачка на C++ тут http://rghost.ru/38394393

P.S. Спасибо Puporev за её решение))

Не по теме:

Задачку во вложении не получилось прикрепить... видать прав недостаточно) нужен рут))

0
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 10
08.07.2015, 21:42
а как сделать чтоб шарик двигался по кругу, только запускать все это дело без кнопки?? Тут есть пример движения шарика по эллипсу, но часть кода вы пишете в обработчик OneClick, а надо чтоб без кнопки.
0
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
09.07.2015, 00:17
Помести код движения объекта по траектории в таймер (хотя это уже сделано).
Таймер изначально должен быть включен (его свойство Enabled сделай равным 1).
1
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 10
09.07.2015, 15:08
У меня все равно как то странно получается, хотел сделать заливку шарика зеленой, так он мне след после него оставляет. Вообще в идеале программа должна выглядеть так. Но я не знаю как это сделать((
[cut]

 Комментарий модератора 
Заливайте пожалуйста все вложения прямо на форум во избежание их удаления на сторонних ресурсах.
Как это сделать написано вот здесь: как работать в редакторах
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2015, 15:08
Помогаю со студенческими работами здесь

Рисование в canvas
Здравствуйте. Как закруглить углы квадрата который нарисован на объекте canvas и как потом на этом квадрате нарисовать вопросительный знак?...

Рисование с Canvas
Подскажите новичку в Delphi-рисовании, как можно стереть с формы всё, что было нарисовано с помощью Canvas.MoveTo(); Canvas.LineTo();...

Рисование в Canvas
Здравствуйте, очень прошу помощи, так как подсказать больше некому. :( Мне нужно реализовать пропорциональное увеличение рисунка в...

Рисование с canvas
Итак, в чем в общем суть моей проблемы я ввожу скажем две координаты точки, надо проверить принадлежность ее к треугольнику, который в...

Рисование в canvas
Есть такая задачка, надо сделать в canvas, с ним никогда не работал. Разработать приложение, в котором имитируется человечек, делающий...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru