3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
1

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

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

Author24 — интернет-сервис помощи студентам
Помогите изобразить движения шарика внутри консольного окна, что бы он не выходил за границу консоли(300 на 300).
Шарик должен двигаться свободно, под разными углами.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2020, 20:22
Ответы с готовыми решениями:

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

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

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

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

6
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
28.04.2020, 20:35 2
Интересна будет посмотреть, как шарик движется по консольному окну...
Идея. Шариком может быть буква О или цифра 0. Буква похожа на шарик больше.

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

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

Теоретически где-то так.
1
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
29.04.2020, 09:56  [ТС] 5
alexu_007
Спасибо, буду пробовать
0
2523 / 1243 / 459
Регистрация: 08.11.2016
Сообщений: 3,415
29.04.2020, 10:50 6
рисование в консольном окне сиедствами WinAPI
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
06.05.2020, 21:50 7
Цитата Сообщение от 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

Код
# -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
06.05.2020, 21:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2020, 21:50
Помогаю со студенческими работами здесь

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

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

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

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

Динамика движения шарика
динамика движения шарика

Изобразить движение шарика внутри коробки с отражением от стенок
Создать массив из 8-ми объектов, изображающих движение шарика внутри коробки с отражением от...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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