Skip to content

Stervar/Heart-3D-Terminal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

❤️ Анимированное 3D Сердце в Терминале ❤️ Animated 3D Heart in Terminal

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

🚀 Описание / Description 🚀

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

📝 Описание проекта 📝

Анимированное 3D Сердце в Терминале Этот проект представляет собой анимированное 3D сердце, которое отображается в терминале. Он создан с использованием языка программирования Python и библиотеки NumPy, что позволяет выполнять математические вычисления и работать с массивами данных. Проект демонстрирует, как можно применять математические концепции для создания визуально привлекательных анимаций в текстовом формате.

📚 Основные компоненты Импорт библиотек 📚

В начале кода импортируются необходимые библиотеки. NumPy используется для работы с массивами и выполнения математических операций. Библиотека time позволяет управлять временем и задержками, а sys используется для взаимодействия с системой, особенно для вывода информации в терминал. Математические функции, такие как синус и косинус, обеспечивают создание параметрических уравнений. Библиотека collections.deque используется для создания двусторонней очереди, которая помогает подсчитывать количество кадров в секунду (FPS). Библиотека colorsys позволяет преобразовывать цвета из HSV в RGB.

🔄 Функция поворота точек: 🔄

Эта функция отвечает за поворот точек, представляющих сердце, вокруг оси Y. Она создает матрицу поворота и применяет ее к массиву точек. Это позволяет создать эффект вращения сердца, что делает анимацию более динамичной и привлекательной.

⏱️ Подсчет FPS ⏱️

Для обеспечения плавности анимации важно контролировать количество кадров в секунду. Функция подсчета FPS вычисляет разницу времени между кадрами и возвращает значение FPS. Это позволяет разработчику оптимизировать производительность анимации и избежать заиканий.

🎨 Цветные символы 🎨

В проекте используется цветовая модель HSV для окраски символов, представляющих сердце. Функция преобразует символы в цветные, используя параметры оттенка, насыщенности и яркости. Это добавляет визуальную глубину и делает анимацию более привлекательной.

🛠️ Создание точек сердца 🛠️

Основная геометрия сердца создается с помощью параметрических уравнений. В функции генерируются координаты точек, формирующих сердце, а также создаются слои для добавления объема. Внутренние точки добавляются случайным образом для улучшения визуального эффекта, что создает более сложную и интересную форму.

✨ Отрисовка сердца ✨

Эта функция отвечает за отображение сердца на экране. Она проецирует 3D координаты на 2D экран, учитывая глубину, и использует символы для отображения. З-буфер используется для управления глубиной отображения, что позволяет избежать наложения символов и создает эффект объемности.

💓 Эффект пульсации 💓

Сердце анимируется с помощью синусоидального изменения размера, что создает эффект пульсации. Это делает анимацию более живой и динамичной, привлекая внимание зрителей.

⚙️ Основная функция ⚙️

В основной функции происходит инициализация, создание точек сердца и управление циклом анимации. Она отвечает за обновление и отображение сердца в терминале, а также за управление FPS. При нажатии Ctrl+C анимация останавливается, и курсор восстанавливается.

🖱️ Взаимодействие с пользователем 🖱️

Пользователь может наблюдать за анимацией сердца в терминале, где оно будет пульсировать и вращаться. Внизу экрана отображается информация о количестве кадров в секунду, что позволяет пользователю видеть производительность анимации. Также предусмотрена возможность выхода из программы в любой момент.

📄 Заключение 📄

Проект "Анимированное 3D Сердце в Терминале" является отличным примером применения математических концепций и программирования для создания визуально привлекательной анимации. Он показывает, как можно использовать Python и его библиотеки для создания интересных графических представлений в текстовом формате, что может быть полезно для обучения и развлечения.

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

🔥 Особенности / Features 🔥

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

"Есть только три основных версии, которые не являются ни копиями, ни продолжениями, так как каждой версии я пытался воссоздать именно что-то новое. За это каждая версия по-своему интересна"

ну вот список самых интерсных и выжных:

  • Heart-12.py
  • Heart-13.py
  • Heart-17.py

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

📊 Установка / Installation 📊

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

  1. Склонируйте репозиторий:

    git clone https://github.com/ваш_логин/Heart-12.git
    cd Heart-12
  2. Установите необходимые зависимости:

    pip install numpy
  3. Запустите проект:

    python Heart-12.py

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

📈 Пример работ / Examples 📈

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

Скриншот Сердца

◢⸻⸻⸻⸻⸻⸻⸻⸻❃⸻⸻⸻⸻⸻⸻⸻⸻◣

🌟 Поддержка проекта / Project Support 🌟

Если вам понравился проект, поставьте ⭐ звезду на GitHub!

Код проекта / Project Code

1. **Импорт библиотек**:
   - В начале кода импортируются необходимые библиотеки:
     - `numpy`: для работы с массивами и математическими операциями.
     - `time`: для работы со временем и задержками.
     - `sys`: для взаимодействия с системой, в частности, для вывода в терминал.
     - `math`: для математических функций, таких как синус и косинус.
     - `collections.deque`: для создания двусторонней очереди, используемой для подсчета FPS.
     - `colorsys`: для преобразования цветов из HSV в RGB.

2. **Функция `rotate_points`**:
   - Эта функция принимает массив точек и угол поворота. Она создает матрицу поворота вокруг оси Y и применяет ее к точкам, возвращая новые координаты.
   - Пример кода:
     ```python
     def rotate_points(points, angle_y):
         Ry = np.array([
             [np.cos(angle_y), 0, np.sin(angle_y)],
             [0, 1, 0],
             [-np.sin(angle_y), 0, np.cos(angle_y)]
         ])
         return np.dot(points, Ry.T)
     ```

3. **Функция `calculate_fps`**:
   - Эта функция подсчитывает количество кадров в секунду (FPS) на основе временных меток, хранящихся в очереди. Она возвращает значение FPS, что позволяет контролировать производительность анимации.
   - Пример кода:
     ```python
     def calculate_fps(fps_counter):
         if len(fps_counter) < 2:
             return 0.0
         time_diff = fps_counter[-1] - fps_counter[0]
         if time_diff <= 0:
             return 0.0
         return len(fps_counter) / time_diff
     ```

4. **Функция `get_colored_char`**:
   - Эта функция преобразует символ в цветной символ, используя HSV цветовую модель. Она принимает символ и его цветовые параметры, а затем возвращает ANSI последовательность для окраски символа.
   - Пример кода:
     ```python
     def get_colored_char(char, hue, saturation=1.0, value=1.0):
         hue = max(0.0, min(1.0, hue))
         r, g, b = [int(x * 255) for x in colorsys.hsv_to_rgb(hue, saturation, value)]
         return f"\033[38;2;{r};{g};{b}m{char}\033[0m"
     ```

5. **Функция `create_heart_points`**:
   - Эта функция генерирует координаты точек, формирующих сердце, используя параметрические уравнения. Она создает несколько слоев для добавления объема и случайные внутренние точки для улучшения визуального эффекта.
   - Пример кода:
     ```python
     def create_heart_points(scale=5, num_points=1000, num_layers=30):
         t = np.linspace(0, 2 * np.pi, num_points)
         x = 16 * np.sin(t) ** 3
         y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t)
         z = np.zeros_like(x)

         points = []
         for i in range(num_layers):
             factor = 1 - i / num_layers
             layer_x = factor * x
             layer_y = factor * y
             layer_z = np.full_like(x, -i / 2)
             points.extend(zip(layer_x, layer_y, layer_z))

         for _ in range(num_points // 2):
             r = np.random.random() * 0.8
             theta = np.random.random() * 2 * np.pi
             phi = np.random.random() * np.pi
             x = r * 16 * np.sin(theta) ** 3 * np.sin(phi)
             y = r * (13 * np.cos(theta) - 5 * np.cos(2 * theta) - 
                      2 * np.cos(3 * theta) - np.cos(4 * theta)) * np.sin(phi)
             z = r * 15 * np.cos(phi)
             points.append((x, y, z))

         return scale * np.array(points)
     ```

6. **Функция `draw_heart`**:
   - Эта функция отвечает за отрисовку сердца на экране. Она проецирует 3D координаты на 2D экран, учитывает глубину и использует символы для отображения.
   - Пример кода:
     ```python
     def draw_heart(points, width=80, height=40, time_val=0):
         shading_chars = " .:!*OQ#"
         x = (points[:, 0] / np.max(np.abs(points[:, 0])) * (width // 2) + width // 2).astype(int)
         y = (-points[:, 1] / np.max(np.abs(points[:, 1])) * (height // 2) + height // 2).astype(int)
         z = points[:, 2]

         mask = (0 <= x) & (x < width) & (0 <= y) & (y < height)
         x, y, z = x[mask], y[mask], z[mask]

         screen = np.full((height, width), ' ', dtype=object)
         z_buffer = np.full((height, width), float('-inf'))

         if len(z) > 0:
             z_min, z_max = np.min(z), np.max(z)
             if z_max > z_min:
                 z_normalized = (z - z_min) / (z_max - z_min)
                 intensity = (z_normalized * (len(shading_chars) - 1)).astype(int)

                 for xi, yi, zi, char_index in zip(x, y, z, intensity):
                     if zi > z_buffer[yi, xi]:
                         z_buffer[yi, xi] = zi
                         z_factor = (zi - z_min) / (z_max - z_min)
                         hue = (time_val + z_factor) % 1.0
                         screen[yi, xi] = get_colored_char(shading_chars[char_index], hue)

         return '\n'.join(''.join(row) for row in screen)
     ```

7. **Функция `pulsating_effect`**:
   - Эта функция создает синусоидальное изменение размера для эффекта пульсации сердца.
   - Пример кода:
     ```python
     def pulsating_effect(time):
         return 1 + 0.05 * math.sin(time * 2)
     ```

8. **Основная функция `main`**:
   - В этой функции происходит инициализация, создание точек сердца, а также основной цикл анимации, который обновляет и отображает сердце в терминале.
   - Пример кода:
     ```python
     def main():
         heart_points = create_heart_points(scale=8)
         angle_y = 0
         print('\033[2J')
         print('\033[?25l')
         fps_counter = deque(maxlen=60)
         start_time = time.time()

         try:
             while True:
                 frame_start = time.time()
                 current_time = frame_start - start_time
                 scale = pulsating_effect(current_time)
                 scaled_points = heart_points * scale
                 rotated_points = rotate_points(scaled_points, angle_y)
                 frame = draw_heart(rotated_points, time_val=(current_time * 0.1) % 1.0)

                 fps_counter.append(time.time())
                 fps = calculate_fps(fps_counter)

                 status_line = f"\033[1mFPS: {fps:.1f} | Press Ctrl+C to exit\033[0m"
                 frame_with_status = frame + "\n" + status_line

                 terminal_width = 80
                 frame_width = len(frame.split('\n')[0])
                 padding = ' ' * ((terminal_width - frame_width ) // 2)
                 frame_with_status = padding + frame_with_status + padding

                 sys.stdout.write('\033[H' + frame_with_status)
                 sys.stdout.flush()

                 angle_y += 0.05

                 frame_time = time.time() - frame_start
                 if frame_time < 0.033:
                     time.sleep(0.033 - frame_time)

         except KeyboardInterrupt:
             print('\033[?25h')
             print("\nProgram terminated")
     ```

 ### Заключение

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published