2017-01-24 62 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

林不知道這些是否可以工作。我只是想確認他們是否過分,然後打破循環。 – Tokela

回答

0

您根本不需要繪圖以找到相交點。事實上,我不認爲matplotlib可以在這裏幫助。 plt.plot的返回值是包含單個Line2D對象列表 - 你可以通過做

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

但是回到原來的X和Y值,你只能做,如果你的代碼是出於某種原因分析由完全不同的功能生成的圖,並且不允許有原始數據。在你的情況下,直接使用你的x和y找到交集。它看起來像你可能試圖做

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

這應該檢查任何點(x,y)是否位於(0,L)。 *充當布爾數組的「元素」和「運算符」。 Here are some more comprehensive answers about finding intersections of two arrays.

如果您正在嘗試構建遊戲,請參閱pygame。它有各種方法來檢測碰撞比在numpy更容易。

相關問題