Анимация Python, линия начинается с точки перемещения и останавливается на втором пересечении - PullRequest
0 голосов
/ 26 ноября 2018

Я делаю программу для имитации ретроградного движения Марса, видимого с Земли.Так что это вид сверху Земли и Марса, вращающихся вокруг Солнца. Существует также линия, идущая от Земли к Марсу.Однако мне нужно, чтобы он пересек точку Марса и продолжал движение до пересечения линии x = 15

import math
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def _update_plot(i, fig, scat, l):
        scat.set_offsets(([math.cos(math.radians(i))*5, math.sin(math.radians(i))*5], [math.cos(math.radians(i/2))*10, math.sin(math.radians(i/2))*10], [0, 0]))
        l.set_data(([math.cos(math.radians(i))*5,math.cos(math.radians(i/2))*10],[math.sin(math.radians(i))*5,math.sin(math.radians(i/2))*10]))
        return [scat,l]

fig = plt.figure()

x = [0]
y = [0]

ax = fig.add_subplot(111)
ax.set_aspect('equal')
ax.grid(True, linestyle = '-', color = '0.10')
ax.set_xlim([-11, 11])
ax.set_ylim([-11, 11])

l, = plt.plot([],[], 'r--', zorder=1)
scat = plt.scatter(x, y, c = x, zorder=2)
scat.set_alpha(0.8)

anim = animation.FuncAnimation(fig, _update_plot, fargs = (fig, scat, l),
                               frames = 720, interval = 10)

plt.show()

1 Ответ

0 голосов
/ 27 ноября 2018

Я не уверен, что полностью понимаю, что вы хотите сделать, но я предполагаю, что вы хотите расширить линию, соединяющую две планеты, до x = 15. В этом случае вы можете сделать следующее:

  • Вычислить направление Земля-Марс, вычитая их положение и нормализуя результирующий вектор.Возьмите одну из планет в качестве начальной точки линии.
  • Решите уравнение первого порядка, которое дает вам расстояние, которое вам нужно пройти, чтобы добраться до оси x = 15.
  • Проверкаявляется ли результат положительным или отрицательным.Если он положительный, то продолжайте идти, если он отрицательный, мы выбрали не ту планету, как для линии, соединяющей два плана, а затем продолжаем движение к x = 15, нам нужно взять другую планету.Мы делаем это путем инвертирования направления и повторного решения уравнения первого порядка с новыми условиями.
  • Найдите координату y точки, в которой линия пересекает ось x = 15
  • Нарисуйте линию от планеты до точки пересечения на оси x = 15.

Что-то вроде этого должно помочь:

def _update_plot(i, fig, scat, l):
        angle = math.radians(i)

        sun_pos = np.array([0., 0.])
        earth_pos = np.array([math.cos(angle)*5, math.sin(angle)*5])
        mars_pos = np.array([math.cos(angle / 2.) * 10, math.sin(angle / 2.) * 10])

        # compute the unit vector that points from Earth to Mars
        direction = mars_pos - earth_pos
        direction /= np.sqrt(np.dot(direction, direction))

        # find out where the line would intersect the x = 15 axis
        start_from = earth_pos
        alpha = (15 - start_from[0]) / direction[0]
        # if alpha comes out to be negative we picked the "wrong" planet
        if alpha < 0:
                start_from = mars_pos
                direction = -direction
                alpha = (15 - start_from[0]) / direction[0]
        y_line = start_from[1] + alpha * direction[1]

        # draw the planets
        scat.set_offsets((earth_pos, mars_pos, sun_pos))
        # draw the line
        l.set_data(([start_from[0], 15], [start_from[1], y_line]))
        return [scat,l]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...