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

Закон отражения в ограниченой зоне на консольном приложении - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Мировые координаты и координаты устройства http://www.cyberforum.ru/cpp-beginners/thread636616.html
Пишу программу с интерфейсом напоминающем Autocad. А точнее ту часть в которой происходит черчение. Т.е. хочу создать поле которое отображало объекты хранящиеся в памяти в мировых координатах с возможностью масштабирования, вращения, перемещения. И вот думаю: как это реализовано в Autocad? С помощью directx, GDI (windows), других графических библиотек или просто оригинальным математическим кодом...
C++ Как преобразовать string в int ? С++ Здравствуйте, можете объяснить как преобразовать string в int ? С++. Объясните как можно проще, так-как я недавно начал изучать программирование. Допустим: #include <iostream> using namespace std; int main() { http://www.cyberforum.ru/cpp-beginners/thread636607.html
static_cast<char>() не выводит некоторые символы C++
Редактор geany, компилятор gcc. cout<< static_cast<char>(4) заместо ожидаемого знака бубей ничего не выводится. При этом cout<< static_cast<char>(100) например, работает коректно.
C++ Ошибка типов данных
У меня возник вопрос: Запускаю программу Я должен ввести число от одного до трех, после значение записывается в переменную типа int Если мое число не подходит под это описание(меньше 0 или больше 3) выходит ошибка, в противном случае программа идет дальше. Но если я ввожу не число, а букву, то мне в бесконечном цикле выводится ошибка, а я хочу независимо от введенного значения (будь то буква...
C++ Объявление функций внутри других функций http://www.cyberforum.ru/cpp-beginners/thread636558.html
Иногда вижу в некоторых исходниках на c объявление функций, внутри main. Например: main(){ double sum(int max_num); } Так вот, хотел спросить зачем это делают?
C++ Закрытый файл У меня программа использует обычный текстовой файл для хранения различный параметров. Мне нужно сделать так, чтобы никакой пользователь не смог изменить их, иначе могут повредить программу. Как можно осуществить это? Может поменять разрешение... Подскажите??? подробнее

Показать сообщение отдельно
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.08.2012, 23:09     Закон отражения в ограниченой зоне на консольном приложении
закон отражения простой. у обехка скорость состоит из скорости по х и по y координате. когда он доходит до стенки (допустим вертикальной), его x скорость меняет знак, y остается без изменения.
сегодня уже интересовались как в консольке хоть что-то нарисовать и вот я дополнил пример движением трех частиц в поле. см функцию ProcessObject. Она и занимается рассчетом координат объекта в поле.

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
 
HANDLE GetConsoleHandle()
{
  return GetStdHandle(STD_OUTPUT_HANDLE);
}
 
void GoToXY(unsigned x, unsigned y)
{
  COORD coord = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
  SetConsoleCursorPosition(GetConsoleHandle(), coord);
}
 
class ScreenBuffer
{
  int m_width;
  int m_height;
  std::string m_buffer;
 
public:
  ScreenBuffer(int width, int height)
    : m_width(width)
    , m_height(height)
  {
    const int size = (m_width + 1) * m_height;
    m_buffer.resize(size);
    Clear();
  }
 
  int GetWidth()
  {
    return m_width;
  }
 
  int GetHeight()
  {
    return m_height;
  }
 
  void Fill(char ch)
  {
    for (size_t i = 0, end = m_buffer.size(); i != end; ++i)
      m_buffer[i] = ch;
 
    for (size_t i = 1, end = m_height; i <= end; ++i)
    {
      m_buffer[(i * (m_width + 1)) - 1] = '\n';
    }
  }
 
  void Clear()
  {
    Fill(' ');
  }
 
  void Draw(int x, int y, char ch)
  {
    m_buffer[y * (m_width + 1) + x] = ch;
  }
 
  void DrawToScreen() const
  {
    GoToXY(0, 0);
    std::cout << m_buffer;
  }
};
 
void DrawBorder(ScreenBuffer& screen)
{
  const int screenWidth = screen.GetWidth();
  const int screenHeight = screen.GetHeight();
 
  for (int i = 0; i < screenWidth; ++i)
  {
    screen.Draw(i, 0, '.');
    screen.Draw(i, screenHeight - 1, '.');
  }
 
  for (int i = 0, end = screen.GetHeight(); i != end; ++i)
  {
    screen.Draw(0, i, '.');
    screen.Draw(screenWidth - 1, i, '.');
  }
}
 
struct Object
{
  int x;
  int y;
  int xSpeed;
  int ySpeed;
  char symbol;
 
  Object()
    : symbol(' ')
    , x(0)
    , y(0)
    , xSpeed(0)
    , ySpeed(0)
  {
  }
 
  Object(char ch, int xx, int yy, int xxSpeed, int yySpeed)
    : symbol(ch)
    , x(xx)
    , y(yy)
    , xSpeed(xxSpeed)
    , ySpeed(yySpeed)
  {
  }
};
 
void ProcessObject(ScreenBuffer& screen, Object& obj)
{
  obj.x += obj.xSpeed;
  obj.y += obj.ySpeed;
 
  if (obj.x >= screen.GetWidth())
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = screen.GetWidth() - 1 - (obj.x - screen.GetWidth());
  }
  else if (obj.x < 0)
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = -obj.x;
  }
 
  if (obj.y >= screen.GetHeight())
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = screen.GetHeight() - 1 - (obj.y - screen.GetHeight());
  }
  else if (obj.y < 0)
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = -obj.y;
  }
}
 
void AddObjects(std::vector<Object>& objs)
{
  objs.push_back(Object('*', 0, 0, 1, 2));
  objs.push_back(Object('!', 7, 20, 1, 1));
  objs.push_back(Object('%', 3, 7, 1, 1));
}
 
int main()
{
  const int screenWidth = 60;
  const int screenHeight = 20;
  ScreenBuffer screen(screenWidth, screenHeight);
 
  std::vector<Object> objs;
  AddObjects(objs);
 
  for (;;)
  {
    screen.Clear();
    DrawBorder(screen);
 
    for (std::vector<Object>::iterator it = objs.begin(), end = objs.end(); it != end; ++it)
    {
      Object& obj = *it;
      ProcessObject(screen, *it); // изменяем координаты и скорость объекта
      screen.Draw(obj.x, obj.y, obj.symbol); // рисуем объект
    }
 
    screen.DrawToScreen();
 
    Sleep(10);
  }
 
  return 0;
}
 
Текущее время: 01:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru