2017-01-24 1 views
0

Предположим, у меня есть объект, который я должен уничтожить путем стрельбы (снаряд). Позиция объекта является случайной (так как теперь просто целые числа, чтобы сделать ее проще). Даже когда моя «пуля» выглядит просто на месте, цикл не прерывается. Вероятно, программа не считает график 1 и график 2 равным в любой точке. Я пробовал несколько вещей об этом условии, но ничего не получилось. Может ли кто-нибудь сказать мне, что я должен добавить/изменить?Почему два аргумента графов не считаются равными?

import matplotlib.pylab as plt 
import numpy as np 
import random 
g = 10 
c = [] 
d = [] 
fig = plt.figure() 
L = random.randint(5.0,18.0) 
while True: 
    try: 
    #velocity 
     v = float(input("What is the velocity?\n>")) 
    #angle 
     a = np.radians(float(input("What is the angle?\n>"))) 
     z = np.sin(2*a)*v**2/g #max range 
     h = ((v**2*(np.sin(a))**2)/(2*g)) #max. height 
     x= np.linspace(0, z, 1000) 
     #y values 
     y = (x*np.tan(a) - (g*x**2)/(2*v**2*((np.cos(a))**2))) 
     ax = plt.axes(xlim=(0, 1.5*L), ylim=(0, 1.2*h)) 

     plt.ion() #interactive graph 
     #previous tries 
     plt.plot(c,d, '.', color = 'lightgrey') 
     plt.pause(0.01) 
     #enemy object 
     graph1 = plt.plot(L, 0, 'o', color = 'r', markersize=30) 
     plt.pause(0.01) 
     #actual shoot 
     graph2 = plt.plot(x,y, '.', color = 'b', ms = 7) 
     plt.pause(0.01) 

     if np.any(graph2) == np.any(graph1): 
      print("You have destroyed the enemy object!") 
      plt.show() 
      break 
     else: 
      print("You've missed. Keep shooting!") 
      c.append(x) 
      d.append(y) 
      plt.show() 
      continue 
    except ValueError: 
     print("Sorry, I can't understand.") 
+0

Вы имеете в виду 'np.any (graph2 == graph1)', или '(graph1 == graph2) .any()'? – mgilson

+0

Я не уверен, что любой из них может работать. Я просто хочу узнать, являются ли они egual, а затем разорвать петлю. – Tokela

ответ

0

Вам не нужно вообще строить участок, чтобы найти перекресток. На самом деле, я не думаю, что matplotlib может помочь здесь. Возвращаемое значение plt.plot список, содержащий один объект Line2D - Вы можете вернуть исходный х и у значения, делая

x_new = graph1[0].get_xdata() 
y_new = graph1[0].get_ydata() 

Однако, вы бы только сделать это, если ваш код был по какой-то причине анализируя графики, созданные совершенно другой функцией, и им не разрешалось иметь исходные данные. В вашем случае просто используйте ваши x и y напрямую и найдите пересечение. Похоже, что вы, возможно, пытается сделать

if np.any((y == 0) * (x == L)): 
    print "You have destroyed the enemy object!" 

Что следует проверить, если любая точка (х, у) находится в точке (0, L). * Действует как элемент-элемент и оператор для булевых массивов. Here are some more comprehensive answers about finding intersections of two arrays.

Если вы пытаетесь построить игру, посмотрите на pygame. У него есть всевозможные методы для обнаружения коллизий намного легче, чем в numpy.

 Смежные вопросы

  • Нет связанных вопросов^_^