Я пытаюсь создать простую анимацию ASCII 3D Spinning Cube Cube в консоли Windows, используя C ++.
Рендеринг работает нормально, но есть одна важная проблема:
Каждый кадр напечатает ниже предыдущего, поэтому терминал продолжает прокручивать вниз по бесконечности, а не обновлять на месте, как нормальная анимация.#include
#include
#include
#include
#include
using namespace std;
const int WIDTH = 80;
const int HEIGHT = 40;
const float cubeWidth = 20;
float A = 0, B = 0, C = 0;
float distanceFromCamera = 100;
float K1 = 40;
char buffer[WIDTH * HEIGHT];
float zBuffer[WIDTH * HEIGHT];
float cosA, sinA, cosB, sinB, cosC, sinC; // biến lượng giác dùng chung
void gotoxy(HANDLE hConsole, int x, int y) {
COORD pos{(SHORT)x, (SHORT)y};
SetConsoleCursorPosition(hConsole, pos);
}
void rotate(float i, float j, float k, float &x, float &y, float &z) {
// rotation quanh 3 trục
float x1 = i;
float y1 = j * cosA - k * sinA;
float z1 = j * sinA + k * cosA;
float x2 = x1 * cosB + z1 * sinB;
float y2 = y1;
float z2 = -x1 * sinB + z1 * cosB;
x = x2 * cosC - y2 * sinC;
y = x2 * sinC + y2 * cosC;
z = z2;
}
void calculatePoint(float i, float j, float k, char ch) {
float x, y, z;
rotate(i, j, k, x, y, z);
z += distanceFromCamera;
float ooz = 1 / z;
int xp = int(WIDTH / 2 + K1 * ooz * x * 2);
int yp = int(HEIGHT / 2 - K1 * ooz * y);
int idx = xp + yp * WIDTH;
if (idx >= 0 && idx < WIDTH * HEIGHT) {
if (ooz > zBuffer[idx]) {
zBuffer[idx] = ooz;
buffer[idx] = ch;
}
}
}
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// Ẩn con trỏ nhấp nháy
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(hConsole, &cursorInfo);
cursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(hConsole, &cursorInfo);
while (true) {
fill(buffer, buffer + WIDTH * HEIGHT, ' ');
fill(zBuffer, zBuffer + WIDTH * HEIGHT, 0);
// tính lượng giác 1 lần mỗi frame
cosA = cosf(A); sinA = sinf(A);
cosB = cosf(B); sinB = sinf(B);
cosC = cosf(C); sinC = sinf(C);
for (float i = -cubeWidth; i < cubeWidth; i += 0.5f) {
for (float j = -cubeWidth; j < cubeWidth; j += 0.5f) {
calculatePoint(i, j, -cubeWidth, '@');
calculatePoint(cubeWidth, j, i, '$');
calculatePoint(-cubeWidth, j, -i, '~');
calculatePoint(-i, j, cubeWidth, '#');
calculatePoint(i, -cubeWidth, -j, ';');
calculatePoint(i, cubeWidth, j, '+');
}
}
gotoxy(hConsole, 0, 0);
for (int k = 0; k < WIDTH * HEIGHT; k++) {
cout
Несмотря на то, что я использую «\ x1b [h», чтобы перенести курсор обратно в верхнюю часть, консоль все еще прокручивается вниз-каждая новая кадра печатается ниже предыдущей. (Я использую vscode в Windows 11). < /P>
Спасибо! < /P>
Что я попробовал: < /p>
Использование "\ x1b [2j" или "\ 033 [h", чтобы очистить экран /перемещение cursor < /p>
std :: flush After Print (CMD, PowerShell, Terminal Windows) < /p>
Ожидаемое поведение:
Я хочу, чтобы куб вращался на месте (в фиксированной области консоли), а не прокручивать вниз. < /P>
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-place-on
Почему моя анимация ASCII продолжает прокручивать вниз вместо того, чтобы обновляться на консоли Windows (C ++)? ⇐ C++
Программы на C++. Форум разработчиков
1759743585
Anonymous
Я пытаюсь создать простую анимацию ASCII 3D Spinning Cube Cube в консоли Windows, используя C ++.
Рендеринг работает нормально, но есть одна важная проблема:
Каждый кадр напечатает ниже предыдущего, поэтому терминал продолжает прокручивать вниз по бесконечности, а не обновлять на месте, как нормальная анимация.#include
#include
#include
#include
#include
using namespace std;
const int WIDTH = 80;
const int HEIGHT = 40;
const float cubeWidth = 20;
float A = 0, B = 0, C = 0;
float distanceFromCamera = 100;
float K1 = 40;
char buffer[WIDTH * HEIGHT];
float zBuffer[WIDTH * HEIGHT];
float cosA, sinA, cosB, sinB, cosC, sinC; // biến lượng giác dùng chung
void gotoxy(HANDLE hConsole, int x, int y) {
COORD pos{(SHORT)x, (SHORT)y};
SetConsoleCursorPosition(hConsole, pos);
}
void rotate(float i, float j, float k, float &x, float &y, float &z) {
// rotation quanh 3 trục
float x1 = i;
float y1 = j * cosA - k * sinA;
float z1 = j * sinA + k * cosA;
float x2 = x1 * cosB + z1 * sinB;
float y2 = y1;
float z2 = -x1 * sinB + z1 * cosB;
x = x2 * cosC - y2 * sinC;
y = x2 * sinC + y2 * cosC;
z = z2;
}
void calculatePoint(float i, float j, float k, char ch) {
float x, y, z;
rotate(i, j, k, x, y, z);
z += distanceFromCamera;
float ooz = 1 / z;
int xp = int(WIDTH / 2 + K1 * ooz * x * 2);
int yp = int(HEIGHT / 2 - K1 * ooz * y);
int idx = xp + yp * WIDTH;
if (idx >= 0 && idx < WIDTH * HEIGHT) {
if (ooz > zBuffer[idx]) {
zBuffer[idx] = ooz;
buffer[idx] = ch;
}
}
}
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// Ẩn con trỏ nhấp nháy
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(hConsole, &cursorInfo);
cursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(hConsole, &cursorInfo);
while (true) {
fill(buffer, buffer + WIDTH * HEIGHT, ' ');
fill(zBuffer, zBuffer + WIDTH * HEIGHT, 0);
// tính lượng giác 1 lần mỗi frame
cosA = cosf(A); sinA = sinf(A);
cosB = cosf(B); sinB = sinf(B);
cosC = cosf(C); sinC = sinf(C);
for (float i = -cubeWidth; i < cubeWidth; i += 0.5f) {
for (float j = -cubeWidth; j < cubeWidth; j += 0.5f) {
calculatePoint(i, j, -cubeWidth, '@');
calculatePoint(cubeWidth, j, i, '$');
calculatePoint(-cubeWidth, j, -i, '~');
calculatePoint(-i, j, cubeWidth, '#');
calculatePoint(i, -cubeWidth, -j, ';');
calculatePoint(i, cubeWidth, j, '+');
}
}
gotoxy(hConsole, 0, 0);
for (int k = 0; k < WIDTH * HEIGHT; k++) {
cout
Несмотря на то, что я использую «\ x1b [h», чтобы перенести курсор обратно в верхнюю часть, консоль все еще прокручивается вниз-каждая новая кадра печатается ниже предыдущей. (Я использую vscode в Windows 11). < /P>
Спасибо! < /P>
Что я попробовал: < /p>
Использование "\ x1b [2j" или "\ 033 [h", чтобы очистить экран /перемещение cursor < /p>
std :: flush After Print (CMD, PowerShell, Terminal Windows) < /p>
Ожидаемое поведение:
Я хочу, чтобы куб вращался на месте (в фиксированной области консоли), а не прокручивать вниз. < /P>
Подробнее здесь: [url]https://stackoverflow.com/questions/79783528/why-does-my-ascii-animation-keep-scrolling-down-instead-of-updating-in-place-on[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия