Оптимизированный код Python с использованием массивов NumPy: нужен эффективный метод рисования точек на экране с использ ⇐ Python
Оптимизированный код Python с использованием массивов NumPy: нужен эффективный метод рисования точек на экране с использ
Я новичок в Python, и у меня есть вопрос по поводу моего кода.
Я работал над проектом Python, где успешно оптимизировал свои вычисления с помощью массивов NumPy. В частности, я работаю над задачей 3D-рендеринга, где у меня есть набор 3D-точек, представляющих куб. Я оптимизировал преобразования и проекции с помощью NumPy, но возникает проблема с производительностью, когда я пытаюсь нарисовать эти точки на экране с помощью Pygame.
Несмотря на оптимизацию математических операций, я обнаружил, что мне все равно нужно перебирать все точки в моем массиве pygame_xy, чтобы отобразить их по отдельности на экране. Эта итерация вызывает заметное снижение производительности моей программы.
Мне нужен совет, как более эффективно изобразить эти точки без необходимости повторения вручную. Есть ли функция Pygame или метод NumPy, который мог бы помочь мне нарисовать эти точки более оптимизированным образом, избегая необходимости проходить через каждую точку отдельно?
вот мой код:
импортировать pygame pygame.init() время импорта импортировать numpy как np импорт математики экран = pygame.display.set_mode((1000, 1000)) часы = pygame.time.Clock() куб = np.array(((0, 0, 0), (0, 10, 0), (10, 10, 0), (10, 0, 0), ... )) y_rotation_matrix = np.array([[math.cos(0.01), 0, math.sin(0.01)], [0, 1, 0], [-math.sin(0.01), 0, math.cos(0.01)]]) Защиту Rotate_y_axis (points_array): Rotated_points_array = np.dot(points_array, y_rotation_matrix) вернуть Rotated_points_array проекция защиты (points_array): проецируемый_массив_точек = массив_точек[:, :2] / 10 вернуть projected_points_array защита Convert_to_pygame(points_list): x_pygame = 1000/2 + ((1/10) *points_list[:, 0]) * 1000/2 y_pygame = 1000/2 - ((1/10) *points_list[:, 1]) * 1000/2 pygame_points_xy = np.column_stack((x_pygame, y_pygame)) вернуть pygame_points_xy пока правда: start_time = время.время() screen.fill((255, 255, 255)) для события в pygame.event.get(): если event.type == pygame.QUIT: pygame.quit() куб = Rotate_y_axis (куб) Cube_projected = проекция (куб) pygame_xy = Convert_to_pygame(cube_projected) для точки в pygame_xy: pygame.draw.circle(экран, (0, 0, 0), точка, 2) pygame.display.flip() конечное_время = время.время() если конечное_время-начало_времени != 0: pygame.display.set_caption(str(1/ (end_time-start_time))) Я попытался передать массив xy_pygame в качестве входных данных для параметра центральной позиции в pygame.draw.circle(), но, к сожалению, этот подход не сработал.
Я новичок в Python, и у меня есть вопрос по поводу моего кода.
Я работал над проектом Python, где успешно оптимизировал свои вычисления с помощью массивов NumPy. В частности, я работаю над задачей 3D-рендеринга, где у меня есть набор 3D-точек, представляющих куб. Я оптимизировал преобразования и проекции с помощью NumPy, но возникает проблема с производительностью, когда я пытаюсь нарисовать эти точки на экране с помощью Pygame.
Несмотря на оптимизацию математических операций, я обнаружил, что мне все равно нужно перебирать все точки в моем массиве pygame_xy, чтобы отобразить их по отдельности на экране. Эта итерация вызывает заметное снижение производительности моей программы.
Мне нужен совет, как более эффективно изобразить эти точки без необходимости повторения вручную. Есть ли функция Pygame или метод NumPy, который мог бы помочь мне нарисовать эти точки более оптимизированным образом, избегая необходимости проходить через каждую точку отдельно?
вот мой код:
импортировать pygame pygame.init() время импорта импортировать numpy как np импорт математики экран = pygame.display.set_mode((1000, 1000)) часы = pygame.time.Clock() куб = np.array(((0, 0, 0), (0, 10, 0), (10, 10, 0), (10, 0, 0), ... )) y_rotation_matrix = np.array([[math.cos(0.01), 0, math.sin(0.01)], [0, 1, 0], [-math.sin(0.01), 0, math.cos(0.01)]]) Защиту Rotate_y_axis (points_array): Rotated_points_array = np.dot(points_array, y_rotation_matrix) вернуть Rotated_points_array проекция защиты (points_array): проецируемый_массив_точек = массив_точек[:, :2] / 10 вернуть projected_points_array защита Convert_to_pygame(points_list): x_pygame = 1000/2 + ((1/10) *points_list[:, 0]) * 1000/2 y_pygame = 1000/2 - ((1/10) *points_list[:, 1]) * 1000/2 pygame_points_xy = np.column_stack((x_pygame, y_pygame)) вернуть pygame_points_xy пока правда: start_time = время.время() screen.fill((255, 255, 255)) для события в pygame.event.get(): если event.type == pygame.QUIT: pygame.quit() куб = Rotate_y_axis (куб) Cube_projected = проекция (куб) pygame_xy = Convert_to_pygame(cube_projected) для точки в pygame_xy: pygame.draw.circle(экран, (0, 0, 0), точка, 2) pygame.display.flip() конечное_время = время.время() если конечное_время-начало_времени != 0: pygame.display.set_caption(str(1/ (end_time-start_time))) Я попытался передать массив xy_pygame в качестве входных данных для параметра центральной позиции в pygame.draw.circle(), но, к сожалению, этот подход не сработал.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение