Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
Studying
 Аватар для Vermont74
2 / 2 / 0
Регистрация: 13.03.2021
Сообщений: 38

Вентилятор

02.12.2022, 21:21. Показов 5524. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет ! Решал задачку на тему вентилятора, и столкнулся с такой проблемой (ниже на скрине). Прошу у вас помощи.

Вот условие:
Напишите программу, которая которая средствами Pygame создает окно 201×201 пиксель, в центре которого расположен вентилятор.

Вентилятор представляет собой круг радиусом 10 пикселей и три лопасти-треугольника. Треугольники являются равнобедренными, наименьший угол которых равен 30 градусов, а длина большей cтороны составляет 70 пикселей. Лопасти расположены под углами 120 градусов друг к другу (см. рисунок).




В момент старта программы одна из лопастей направлена вертикально вверх.

Нажатие на правую кнопку мышки увеличивает скорость вращения по часовой стрелке на 50 градусов в секунду. Нажатие на левую — уменьшает.

Скорость может стать отрицательной. В этом случае вентилятор вращается против часовой стрелки.

Реализуйте модель вентилятора.


Вот проблема:
Название: VDFKv.png
Просмотров: 340

Размер: 3.8 Кб

Вот мой код:
Python
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
import pygame
import math
 
 
def main():
    # инициализация Pygame:
    pygame.init()
 
    screen = pygame.display.set_mode([201, 201])
    screen.fill(pygame.Color('black'))
    clock = pygame.time.Clock()
    running = True
    fps = 70
    transform_angle = 0
 
    center_radius = 10.0
 
    a = b = 70
    angle = 0.5235987755982988  # radians of 30 degrees
    osnovanie = math.sqrt((a ** 2 + b ** 2) - (2 * a * b * math.cos(angle)))  # теорема косинусов
    # osnov_big = math.sqrt(a ** 2 - 35 ** 2)  # основание треуг-ков с углом 120
 
    # координаты вершин лопастей
    coords = [[(101, 101), (101 + osnovanie / 2, 101 - a), (101 - osnovanie / 2, 101 - a)],
              [(101, 101), (171, 121), ((101 + osnovanie / 2) + 35, 150)],
              [(101, 101), (101 - 70, 121), ((101 - osnovanie / 2) - 35, 150)]]
 
    # общий цвет для лопастей и центра
    color = pygame.Color('white')
 
    screen2 = pygame.Surface((201, 201), pygame.SRCALPHA)
    pygame.draw.circle(screen2, color, (101, 101), center_radius)
    pygame.draw.polygon(screen2, color, coords[0])
    pygame.draw.polygon(screen2, color, coords[1])  # right
    pygame.draw.polygon(screen2, color, coords[2])  # left
 
    screen.blit(screen2, (0, 0))
 
    while running:
        screen.fill(pygame.Color('black'))
 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
 
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:  # левая кнопка мыши
                    transform_angle -= 10
                elif event.button == 3:  # правая кнопка мыши
                    transform_angle += 10
 
        screen2 = pygame.transform.rotate(screen2, transform_angle)
        rect = screen2.get_rect()
        rect.center = (101, 101)
        screen.blit(screen2, rect)
 
        pygame.display.flip()
        clock.tick(fps)
 
    pygame.quit()
 
 
if __name__ == '__main__':
    main()
Буду очень благодарен за помощь !
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.12.2022, 21:21
Ответы с готовыми решениями:

Вентилятор
Привет! Помогите написать программу, которая которая средствами Pygame создает окно 201×201 пиксель, в центре которого расположен...

12 см вентилятор на радиатор для процессора,поддерживающий 8 см вентилятор
Всем привет,вот хочу сделать охлаждение процессора более высоким.И выбор пал на 12 сантиметровый кулер.Но как его прицепить?Радиатор имеет...

Сгорел вентилятор или бракованный вентилятор
Купил вентилятор компании Arctic модель F12 Silent 3 pin. Хотел заменить на блоке питания на данный вентилятор. Вентилятор у меня не...

3
Studying
 Аватар для Vermont74
2 / 2 / 0
Регистрация: 13.03.2021
Сообщений: 38
02.12.2022, 21:23  [ТС]
Насколько я понял, рисунок просто накладывается сам на себя, но ведь эта строка очищает общий "холст".
Цитата Сообщение от Vermont74 Посмотреть сообщение
screen.fill(pygame.Color('black'))
0
4 / 3 / 1
Регистрация: 20.06.2022
Сообщений: 9
04.01.2023, 16:21
если еще актуально: твоя проблема заключается в том, что ты вращаешь уже повернутое изображение, что создает огромную нагрузку на комп -> изображение искажается
я эту проблему решил таким образом: создаю в цикле экран screen3 (он каждый раз новый, и из-за этого искажение не появляется) и поворачиваю его каждый раз на угол rotation (rotation - дополнительная переменная перед циклом = 0, которая при каждом прохождении цикла растет/убывает, т.к. сначала мы крутим экран на 10 градусов, затем на 20, затем на 30...), после чего накладываю на screen
вот что у меня получилось:
вместо этого куска кода:
Python
1
2
3
4
    screen2 = pygame.transform.rotate(screen2, transform_angle)
    rect = screen2.get_rect()
    rect.center = (101, 101)
    screen.blit(screen2, rect)
нужно записать этот + переменная rotation в начале
Python
1
2
3
4
5
    rotation += transform_angle
    screen3 = pygame.transform.rotate(screen2, rotation)
    rect = screen3.get_rect()
    rect.center = (101, 101)
    screen.blit(screen3, rect)
1
0 / 0 / 0
Регистрация: 22.12.2024
Сообщений: 1
22.12.2024, 17:26
Python
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
import pygame
import math
 
 
def main():
    pygame.init()
 
    screen = pygame.display.set_mode([201, 201])
    screen.fill(pygame.Color('black'))
    clock = pygame.time.Clock()
    running = True
    fps = 70
    transform_angle = 0
    rotation_speed = 0
 
    center_radius = 10.0
 
    a = b = 70
    angle = math.radians(30)
    osnovanie = math.sqrt((a ** 2 + b ** 2) - (2 * a * b * math.cos(angle)))
    coords = [
        [(101, 101), (101 + osnovanie / 2, 101 - a), (101 - osnovanie / 2, 101 - a)],
        [(101, 101), (171, 121), ((101 + osnovanie / 2) + 35, 150)],
        [(101, 101), (101 - 70, 121), ((101 - osnovanie / 2) - 35, 150)]
    ]
 
    color = pygame.Color('white')
 
    screen2 = pygame.Surface((201, 201), pygame.SRCALPHA)
    pygame.draw.circle(screen2, color, (101, 101), center_radius)
    pygame.draw.polygon(screen2, color, coords[0])
    pygame.draw.polygon(screen2, color, coords[1])
    pygame.draw.polygon(screen2, color, coords[2])
 
    while running:
        screen.fill(pygame.Color('black'))
 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
 
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    rotation_speed -= 1
                elif event.button == 3:
                    rotation_speed += 1
 
            if event.type == pygame.MOUSEBUTTONUP:
                pass
 
        transform_angle += rotation_speed
 
        rotated_surface = pygame.transform.rotate(screen2, transform_angle)
        rect = rotated_surface.get_rect(center=(101, 101))
        screen.blit(rotated_surface, rect)
 
        pygame.display.flip()
        clock.tick(fps)
 
    pygame.quit()
 
 
if __name__ == '__main__':
    main()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2024, 17:26
Помогаю со студенческими работами здесь

Вентилятор БП
Всем привет. Недавно начал замечать, что во время работы блок питания резко глушится, раньше он работал довольно шумно(т.е для меня это...

Вентилятор
Доброго времени суток! Хочу купить доп. вентилятор AEROCOOL Motion 8 Plus на материнку P5KPL-AM SE там многие пишут, что мать должна...

Вентилятор
Напишите программу, которая которая средствами Pygame создает окно 201×201 пиксель, в центре которого расположен вентилятор. ...

Вентилятор ЦП
Добрый день. У меня вот такая проблема. При нагрузке процессора падают обороты вентилятора. В покое где то 1500, при нагрузке 900. Чем...

Вентилятор на процессоре
Здравствуйте. Давно мучаюсь с данной проблемой: Есть материнская плата: Intel Topsfield DP43TF Температура процессора(2-х ядерный) во...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru