Перемещение стимулов по криволинейному пути в психопатии

#python #trigonometry #psychopy

Вопрос:

Я пытаюсь переместить изображение по изогнутому пути, в основном из координат (-5, -3) в (5, 3), следуя уравнению f(x) = -0,04 x^2 -2. Я пытаюсь понять, что я здесь делаю неправильно, потому что изображение перемещается по диагонали, а затем программа останавливается. Как мне следует создать кривую, вдоль которой будет строиться изображение?

 import os
import time 
from psychopy import visual, event, core, monitors
import glob
from math import log10, floor, pow
import numpy as np


win = visual.Window([600, 600], units = 'pix', monitor = 'testMonitor', color = [.4,.7,1], colorSpace = "rgb")

keys = event.BuilderKeyResponse()

path = "/Users/Desktop/"
dot1 = visual.ImageStim(win, image = path   "crab.png", size = [5,5], units = 'deg', pos = (-5, -3))
FrameN = 50
speed = 1  # initial speed in whatever unit the stimulus use.
angle = 45  # initial angle in degrees
x_change = np.cos(angle) * speed  # initial
y_change = np.sin(angle) * speed  # initial

dot1.draw()
win.flip()

sign = 1

while True:
    if FrameN == 50:
        angle_current = np.rad2deg(np.arctan(y_change / float(x_change)))  # float to prevent integer division
        # More new stuff: Change direction angle (in degrees)
        x_change = np.cos(angle_current   0.001) * speed
        y_change = np.sin(angle_current   0.001 * sign) * speed

        dot1.pos =(x_change, y_change)

        if dot1.pos[0] >= 0 or dot1.pos[1] >= 0:
            sign *= -1
            print('y-direction switched')
            break

        if dot1.pos[0] < -5:
            dot1.pos = (-5, -3)
            print("x-change and y -change : {0}, {1} at {2}, {3}".format(x_change, y_change, dot1.pos[0], dot1.pos[1]))


        if dot1.pos[0] >= 5:
            dot1.pos = (5, -3)
            print("x-change and y -change : {0}, {1} at {2}, {3}".format(x_change, y_change, dot1.pos[0], dot1.pos[1]))
            break

        if dot1.pos[1] < -3:
            print('hit lower bound')
            break
    FrameN  = 1
        



    dot1.draw()
    win.flip()

    if event.getKeys(keyList=["escape"]):
        core.quit()

core.wait(4)
core.quit()