Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170

Изобразить движения шарика

28.04.2020, 20:22. Показов 2925. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите изобразить движения шарика внутри консольного окна, что бы он не выходил за границу консоли(300 на 300).
Шарик должен двигаться свободно, под разными углами.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2020, 20:22
Ответы с готовыми решениями:

Изобразить движение шарика внутри четырехугольника
Здравствуйте! Нужна задача на Pascal или C++! Есть Выпуклый четырехугольник! Вот такой к примеру (грубо говоря =)), можно немного...

Отрисовка движения шарика по кривой
Доброго времени суток. Прошу вашей помощи. Вот задача: Есть кривая (что-то вроде ямки), нужно нарисовать, как шарик катится по этой...

Анимация движения шарика по окружности
Есть программа в которой шарик движется от правой до левой стенки. Нужно переделать программу чтобы шарик двигался по окружности. Код:...

6
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
28.04.2020, 20:35
Интересна будет посмотреть, как шарик движется по консольному окну...
Идея. Шариком может быть буква О или цифра 0. Буква похожа на шарик больше.

Добавлено через 1 минуту
А "Q" ваще маленький воздушный шарик, даже с хвостиком.
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
28.04.2020, 20:45  [ТС]
alexu_007
Согласен, некорректно поставленный вопрос. Я вообще работаю в С++\CLI. Нужно что бы PitcureBox двигался по форме свободно, и не выходил за ее пределы. Мне нигде не отвечают, думал может тут на каком-то примере попытаюсь понять как реализовать.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
29.04.2020, 06:40
По С++\CLI конкретно сказать ничего не могу.

В Qt:
1. Есть объект scene, который как раз заточен под рисование и движение графических объектов. Там всё относительно просто.
2. Если без сцены, руками, то в рисовании графики на форме есть готовые методы рисования графических примитивов: точка, линия, многоугольник, эллипс(круг). Пишешь функцию, рисующую круг по переданным в неё координатам и радиусу. По сигналу таймера передаёшь новые координаты - круг движется. Для отскока от стенок проверяешь координаты, если центр на расстоянии радиуса - значит окружность коснулась стенки и нужно менять направление движения, делать отскок.

Теоретически где-то так.
1
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
29.04.2020, 09:56  [ТС]
alexu_007
Спасибо, буду пробовать
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,683
29.04.2020, 10:50
рисование в консольном окне сиедствами WinAPI
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,963
Записей в блоге: 216
06.05.2020, 21:50
Цитата Сообщение от sokk28 Посмотреть сообщение
Я вообще работаю в С++\CLI. Нужно что бы PitcureBox двигался по форме свободно, и не выходил за ее пределы. Мне нигде не отвечают, думал может тут на каком-то примере попытаюсь понять как реализовать.
Если не в консоли можно, то библиотека SFML имеет класс для рисования круга. Следующие строки кода создают зелёный круг радиусом 20:

C++
1
2
    sf::CircleShape disk(20.f);
    disk.setFillColor(sf::Color::Green);
Лучше Pivot Point установить в центр круга, так удобнее отслеживать столкновения со стенками экрана: void sf::Transformable::setOrigin( const Vector2f & origin ). Так как радиус равен 20, то по X и Y нужно задать 20, чтобы Pivot Point был в центре:

C++
1
    disk.setOrigin(20, 20);
В SFML есть встроенный реализованный анимационный цикл, то есть участок кода, который вызывается в цикле и в котором можно:
  • изменять координаты круга путём прибавления к координатам небольшого значения: шага (я назвал эти значения: скорость по X и скорость по Y)
  • проверять не пришло ли время изменить направление движения с помощью оператора условия if. Например, если координата круга по X меньше чем (ноль - радиусКрусга) или больше, чем (ширинаОкна - радиусКруга), то меняем знак шага (x_speed) на противоположенный

C++
1
2
3
4
5
6
        x += x_speed;
        y += y_speed;
        if (x < 0 + disk.getRadius() || window.getSize().x - disk.getRadius() < x)
        {
            x_speed *= -1;
        }
Скачать исходники: moving-disk-for-sokk28-sfml-cpp.rar

В исходниках есть EXE и несколько DLL. Если какой-то DLL не будет хватать, то сообщите, пожалуйста, какую DLL требует.



main.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
#include <iostream>
#include <sstream>
#include <SFML/Graphics.hpp>
 
template <typename T>
std::string to_string_with_presision(const T a_value, const int n = 1)
{
    std::ostringstream out;
    out.precision(n);
    out << std::fixed << a_value;
    return out.str();
}
 
int main()
{
    sf::RenderWindow window(sf::VideoMode(280, 280), L"Отскоки круга");
 
    sf::CircleShape disk(20.f);
    disk.setFillColor(sf::Color::Green);
    disk.setOrigin(20, 20);
    
    sf::Font font;
    if (!font.loadFromFile("Fonts/arial.ttf"))
    {
        std::cout << "Failed to load the font file.";
        return EXIT_FAILURE;
    }
 
    sf::Text text;
    text.setFont(font);
    text.setCharacterSize(24);
    text.setFillColor(sf::Color::Red);
    text.setStyle(sf::Text::Bold);
    text.setString("(000.0, 000.0)");
    float textWidth = text.getLocalBounds().width;
    float textHeight = text.getLocalBounds().height;
    text.setOrigin(textWidth / 2, textHeight / 2);
 
    float x = 50;
    float y = 150;
    float x_speed = 0.1f;
    float y_speed = 0.1f;
 
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
        x += x_speed;
        y += y_speed;
        if (x < 0 + disk.getRadius() || window.getSize().x - disk.getRadius() < x)
        {
            x_speed *= -1;
        }
 
        if (y < 0 + disk.getRadius() || window.getSize().y - disk.getRadius() < y)
        {
            y_speed *= -1;
        }
 
        disk.setPosition(x, y);
        text.setPosition(x, y - disk.getRadius() - textHeight);
        text.setString("(" + to_string_with_presision(x) + ", " + to_string_with_presision(y) + ")");
 
        window.clear(sf::Color::White);
        window.draw(disk);
        window.draw(text);
        window.display();
    }
 
    return EXIT_SUCCESS;
}


Makefile

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
# -mwindows
 
CC = g++
 
INC = -I"E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\include"
 
LIB = -L"E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\lib"
 
all: main.o
    $(CC) main.o $(LIB) -lsfml-system -lsfml-window -lsfml-graphics -o app
 
main.o: main.cpp
    $(CC) -c $(INC) main.cpp


Миниатюра
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.05.2020, 21:50
Помогаю со студенческими работами здесь

Графика: Написать программу движения шарика вдоль заданной линии
Написать программу движения шарика вдоль заданной линии Начертить оси координат, график и осуществить движение шарика y=In x Помогите...

Изобразить полет шарика
Изобразить полет шарика по диагонали вниз, отталкивание от нижней границы экрана и продолжение полета по диагонали вверх в правый верхний...

Изобразить движение шарика
Здраствуйте еще раз , форумчани, есть такая задачка: Шарик диаметром D, который считыветься их поля TEdit передвигается по полю формы со...

Изобразить движение шарика в реальном времени
Вот задание : Шарик диаметром 30 пикселей передвигается равномерно по форме в горизонтальном направлении слева с швидкисю, которая...

Изобразить движение шарика в области квадрата
Дан квадрат, разделенный на две части линией. В нижней части бегает шарик. Нужно сделать так, чтобы наверху бегал второй. Но что бы не...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
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 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты 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. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru