Можно ли использовать простые матрицы вращения для имитации круговых орбит в пигмеях? - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь вращать весь сценарий py-игры, точка за точкой, чтобы симулировать трехмерное пространство. Я заметил, однако, что простые матрицы вращения просто не преуспевают в долгосрочной перспективе. Если я проведу тестовый код ниже, орбитальный круг будет стремиться «упасть» к центру своей орбиты. Это странно для меня, потому что я сделал эту работу в более простых средах (геогебра), и я чувствую, что это должно работать еще лучше с питоном.

Тестовый код будет:

import time
import numpy as np
import pygame

pygame.init()

#screensize
screensize = (width,height)=(600,600)
center=(int(width/2),int(height/2))
screen = pygame.display.set_mode(screensize)

#delta mov
do=0.1

#orbiting point
k=[100,100]

run=True
while run:
    pygame.time.delay(20)
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            run=False

    #rotation
    k[0]=np.cos(do)*k[0]-np.sin(do)*k[1]
    k[1]=np.sin(do)*k[0]+np.cos(do)*k[1]

    pygame.draw.circle(screen,(255,255,255),(int(k[0]+center[0]),int(k[1]+center[1])),5)
    pygame.display.update()
    screen.fill((0,0,0))
pygame.quit()

Конечно, я могу справиться с проблемой, уменьшив time.delay и угол поворота, чтобы сделать лучшие приближения, но это не вариант для всего моделирования, который я пытаюсь нарисовать, так как это потребовало бы много ресурсов от моего довольнобазовый ноутбук ... боюсь, я просто многого прошу в библиотеку.

¿Есть ли какие-либо предложения о том, как решить эту проблему? Using Это плохая идея - использовать функции numy для синуса и косинуса?

Может быть, я просто глуп, и что-то не так, что я не могу заметить!

Я не эксперт, поэтому я был бы очень признателен, если бы было какое-то решение, не требующее дополнительных библиотек.

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 02 ноября 2019

Проблема в том, что вы манипулируете исходной точкой k. Из-за ограниченной точности операций с плавающей запятой точка слегка смещается на каждом шаге.

Сохраните исходную точку, но увеличьте угол и вычислите новую точку в зависимости от исходной точки в каждом кадре. Например:

kr = np.cos(do)*k[0]-np.sin(do)*k[1], np.sin(do)*k[0]+np.cos(do)*k[1]
do += 0.1

См. пример

do = 0.0
k = [100, 0]

run=True
while run:
    pygame.time.delay(20)
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            run=False

    #rotation
    kr = np.cos(do)*k[0]-np.sin(do)*k[1], np.sin(do)*k[0]+np.cos(do)*k[1]
    do += 0.1

    pygame.draw.circle(screen,(255,255,255),(int(kr[0]+center[0]),int(kr[1]+center[1])),5)
    pygame.display.update()
    screen.fill((0,0,0))
...