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

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

31.05.2012, 04:11. Показов 25090. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru