Форум программистов, компьютерный форум CyberForum.ru

Отражение шара от стенок коробки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
TXLib.h
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
06.12.2010, 14:03     Отражение шара от стенок коробки #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
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "TXLib.h"
 
void DrawCircle (int x, int y, int r);
void MoveCircle (int x, int y, int r, int v);
void Echo(int x, int y, int r, int v, int vx, int vy);
 
int main()
{
txCreateWindow (500, 500);
 
DrawCircle (200, 200, 20);
MoveCircle (200, 200, 20, 15);
Echo (200, 200, 20, 15, 3000, 3000);
 
}
 
void DrawCircle (int x, int y, int r)
{
txSetColor (TX_RED);
txSetFillColor (TX_BLACK);
txCircle (x, y, r);
}
 
void MoveCircle (int x, int y, int r, int v)
{
int t = 0;
while (1 < 2)
        {   
txClear ();            
DrawCircle (x + t*v, y + t*v, r);
t++;
txSleep (100);
        }
}     
 
void Echo (int x, int y, int r, int v, int vx, int vy)
{
int t = 0;
while (1 < 2);
        {
txClear ();
if (x = 0)
              {
vx = - vx;
              } 
                                       
if (y = 0)
              {
vy = - vy;
              }
                                                                                       
if (x = 500)
              {
vx = - vx;
              }                                                                                                                                      
if (y = 500)
              {
vy = - vy;
              }                                                                                                                                              
t++;
txSleep (100);              
         }
}
Возможно, ошибка связана с неупотреблением else?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2010, 14:03     Отражение шара от стенок коробки
Посмотрите здесь:

C++ Шары и коробки
Динамическое программирование. Вложенные коробки. C++
C++ Название задачи: Коробки (Тема НОД, НОК)
отражение матрицы C++
Кросплатформенные сокеты из коробки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
06.12.2010, 14:05     Отражение шара от стенок коробки #2
TXLib.h, хз конечно, но может оттого, что координаты никогда не станут равны 0? Попробуйте в условиях сделать <0, ну и >500 соответственно.
TXLib.h
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
06.12.2010, 14:08  [ТС]     Отражение шара от стенок коробки #3
Сейчас попробую, но можете нубопрогеру объяснить, почему они не могут быть равны нулю???

Добавлено через 1 минуту
Не. с <0 и > 500 не прокатило(всё то же : ошибки нет, но шар продолжает улетать за экран
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
06.12.2010, 14:56     Отражение шара от стенок коробки #4
Ф-ция echo у вас вообще не вызывается, т.к. бесконечно работает move. Смысл в ней что-то менять? Вот попробовал что-то накалякать, жутко конечно, по идее саму ф-цию move надо загнать в цикл.
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
void DrawCircle (int x, int y, int r);
void MoveCircle (int x, int y, int v, int dx, int dy);
 
int main()
{
    txCreateWindow (500, 500);
    MoveCircle (200, 300, 10, 1, 1); 
   // старт из точки 200:300 со скоростью 10 и положительным направлением по x и y
}
 
void DrawCircle (int x, int y, int r)
{
    txClear ();  
    txSetColor (TX_RED);
    txSetFillColor (TX_BLACK);
    txCircle (x, y, r);
}
 
void MoveCircle (int x, int y, int v, int dx, int dy)
{
    while (true)
    {
        x += dx*v;
        y += dy*v;
        if (x < 0 || x>500)
        {
            dx=-dx;
        } 
 
        if (y < 0 || y>500)
        {
            dy=-dy;
        } 
 
        DrawCircle (x, y, 20);
        txSleep (100);
    }
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.12.2010, 20:03     Отражение шара от стенок коробки #5
Вот откровенный говнокод на Qt, но шарик от стен таки отскакивает
MyWidget.h
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
#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QtGui>
 
class MyWidget : public QWidget {
    Q_OBJECT
    int dx;
    int dy;
    QRect circleBounds;
public:
    MyWidget(QWidget * parent) : QWidget(parent) {
        dx = 10;
        dy = 10;
        circleBounds.setLeft(34);
        circleBounds.setTop(21);
        circleBounds.setWidth(50);
        circleBounds.setHeight(50);
 
        QTimer * timer = new QTimer();
        connect(timer, SIGNAL(timeout()), this, SLOT(repaint()));
        timer->start(100);
    }
 
    void paintEvent(QPaintEvent *){
        QPainter painter(this);
        painter.setPen(Qt::NoPen);
        painter.setBrush(Qt::white);
        painter.drawRect(this->rect());
 
        if ( ( circleBounds.left() + dx ) < 0 || ( circleBounds.right() + dx ) > this->rect().width() )
            dx = -dx;
        if ( ( circleBounds.top() + dy ) < 0 || ( circleBounds.bottom() + dy ) > this->rect().height() )
            dy = -dy;
        circleBounds.setLeft(circleBounds.left() + dx);
        circleBounds.setTop(circleBounds.top() + dy);
        circleBounds.setWidth(50);
        circleBounds.setHeight(50);
        painter.setBrush(Qt::red);
        painter.drawEllipse(circleBounds);
    }
 
};
 
#endif // MYWIDGET_H
app.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QtGui>
#include "MyWidget.h"
 
 
int main(int argc, char ** argv){
    QApplication app(argc, argv);
    MyWidget mw(0);
 
    mw.resize(500, 500);
    mw.show();
 
    return app.exec();
}
TXLib.h
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
07.12.2010, 13:55  [ТС]     Отражение шара от стенок коробки #6
dihlofos,
easybudda,
Спасибо,
dihlofos, можешь объяснить, где мы задаём числовое значение радиуса?
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
07.12.2010, 13:57     Отражение шара от стенок коробки #7
TXLib.h, вот:
C++
1
DrawCircle (x, y, 20);
Третий аргумент = 20 и есть радиус. Лучше его сделать конечно отдельной переменной.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2010, 14:11     Отражение шара от стенок коробки
Еще ссылки по теме:

Коробки C++
отражение матриц C++

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

Или воспользуйтесь поиском по форуму:
TXLib.h
 Аватар для TXLib.h
3 / 3 / 0
Регистрация: 01.12.2010
Сообщений: 68
07.12.2010, 14:11  [ТС]     Отражение шара от стенок коробки #8
Ааа...

Я не обратил внимания на эту строку)спс

Добавлено через 4 минуты
Я добавил параметр r в MoveCircle и прибавил/вычел к x/y в условиях, чтобы шар наполовину не заходил за пределы окна. Конечно, можно было просто вычесть или прибавить 20, но так всё-таки поцивильнее

Добавлено через 4 минуты
заодно ушла и 20 в DrawCircle

Добавлено через 2 минуты
эээ... а спасибо-то зачем?
Yandex
Объявления
07.12.2010, 14:11     Отражение шара от стенок коробки
Ответ Создать тему
Опции темы

Текущее время: 16:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru