2016-12-16 215 views
2

我想在2D空間中旋轉一個圖形(由線組成)。我使用這種技巧: (1)我在原點翻譯圖形。旋轉點在(0,0) (2)我執行旋轉 (3)我把圖回來使用matplotlib旋轉矩陣使用旋轉矩陣

問題來自我的旋轉功能。不知道爲什麼它不起作用,因爲我使用了旋轉矩陣。您不需要必須查看整個代碼,只需查看「旋轉」功能和「動畫」功能即可。你會看到我發表評論來幫助你。

如果你執行整件事,你會看到一條線緩慢移動。我不知道它是什麼,但它不是預期的結果。我應該看到我的身影旋轉。

如果你不做旋轉,只是翻譯兩次(步驟(1)和步驟(3)我的過程),你會看到整個數字不移動(這是預計,因爲我把它移動到中心和把它放在原來的位置),你可以看到這個圖形的樣子。所以唯一的問題來自旋轉功能。

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
import pylab as pl 
import math 

#Deplacement de la base pour pouvoir utiliser la matrice de rotation 
def center(x,y,c): 
    for i in range(len(x)): 
     x[i] = x[i] - c[0] 
    for i in range(len(y)): 
     y[i] = y[i] - c[1] 
    return None 

#Remettre la base à sa place 
def recenter(x,y,c): 
    for i in range(len(x)): 
     x[i] = x[i] + c[0] 
    for i in range(len(y)): 
     y[i] = y[i] + c[1] 
    return None 

#Rotation 
def rotation(x,y,angle): 
    my_list = [[],[]] 
    for i in range(len(x)): 
     my_list[0].append(x[i]*math.cos(angle) + y[i]*math.sin(angle)) 
    for j in range(len(y)): 
     my_list[1].append(x[i]*math.sin(angle)*(-1) + y[i]*math.cos(angle)) 
    return my_list 

#Here is the rotation matrix 
#cos sin 
#-sin cos 

# First set up the figure, the axis, and the plot element we want to animate 
fig = plt.figure() 
ax = plt.axes(xlim=(-125, 125), ylim=(-250, 250)) 
line, = ax.plot([], [], lw=2) 

#Les lignes du tableau 
plt.plot([0, 125], [50, 50], color='k', linestyle='-', linewidth=2) 
plt.plot([0, 125], [200, 200], color='k', linestyle='-', linewidth=2) 
plt.plot([17.5, 107.5], [80, 80], color='k', linestyle='-', linewidth=2) 
plt.plot([17.5, 107.5], [110, 110], color='k', linestyle='-', linewidth=2) 
plt.plot([17.5, 107.5], [140, 140], color='k', linestyle='-', linewidth=2) 
plt.plot([17.5, 107.5], [170, 170], color='k', linestyle='-', linewidth=2) 
plt.plot([17.5, 17.5], [80, 170], color='k', linestyle='-', linewidth=2) 
plt.plot([17.5, 17.5], [80, 170], color='k', linestyle='-', linewidth=2) 
plt.plot([47.5, 47.5], [80, 170], color='k', linestyle='-', linewidth=2) 
plt.plot([77.5, 77.5], [80, 170], color='k', linestyle='-', linewidth=2) 
plt.plot([107.5, 107.5], [80, 170], color='k', linestyle='-', linewidth=2) 

# initialization function: plot the background of each frame 
def init(): 
    line.set_data([], []) 
    return line, 

# animation function. This is called sequentially 
def animate(i): 
    c1 = 62.5 
    c2 = 10 
    pt_rot = (c1, c2) #Point from which I want to rotate 
    x = [47.5, 47.5, 77.5, 77.5, 47.5, 62.5, c1, 57.5, 67.5] 
    y = [15, 45, 45, 15, 15, 15, c2, 10, 10] 

    center(x,y,pt_rot) 
    #Uncomment these 3 following lines to test the double translation 
    my_list = rotation(x,y,(i/180)) 
    x = my_list[0] 
    y = my_list[1] 
    recenter(x, y, pt_rot) 

    line.set_data(x,y) 

    return line, 

# call the animator. blit=True means only re-draw the parts that have changed. 
anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=200, interval=20, blit=True) 

plt.show() 
+0

函數'angle_position'的作用是什麼?它從未在腳本中調用過。你問題的最後一段似乎是重要的一段。然而,這也是最不理解的一個。爲什麼翻譯不能移動任何東西呢?整個問題到底是什麼?如果線條旋轉,它應該做什麼,更正?當我運行你的代碼時,我沒有看到任何旋轉。試着在你的問題中寫下「預期的行爲:<一些句子>」和「觀察到的行爲:<一些句子>」來澄清。 – ImportanceOfBeingErnest

+0

對不起,我會在問題中做出更加精確的更改。 –

+0

我想我回答你所有的問題: –

回答

1

有在腳本中兩個主要問題:

  1. 在旋轉功能,你讓j循環,但在i方面樹立xy,這是第一循環結束後的恆定。

  2. 您可以用度數設置旋轉角度。但是,三角函數需要輻射體中設置的角度。所以基本上你需要將角度乘以2π。

第三點,這是不是一個真正的問題,但使腳本難以閱讀的是,你在翻譯函數返回None。如果每個函數都返回一些值,並且將這些值返回到下一個函數,我發現它更易於閱讀。

這是一個完整的可運行腳本。

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
import math 


def center(x,y,c): 
    for i in range(len(x)): 
     x[i] = x[i] - c[0] 
    for i in range(len(y)): 
     y[i] = y[i] - c[1] 
    # return x,y <--------------------- here 
    return x,y 

def recenter(x,y,c): 
    for i in range(len(x)): 
     x[i] = x[i] + c[0] 
    for i in range(len(y)): 
     y[i] = y[i] + c[1] 
    # return x,y <--------------------- here 
    return x,y 

def rotation(x,y,angle): 
    my_list = [[],[]] 
    for i in range(len(x)): 
     my_list[0].append(x[i]*math.cos(angle) + y[i]*math.sin(angle)) 
    for j in range(len(y)): 
     #Big mistake here, replace i by j <--------------------- here 
     my_list[1].append(x[j]*math.sin(angle)*(-1.) + y[j]*math.cos(angle)) 
    return my_list[0], my_list[1] 



fig = plt.figure() 
ax = plt.axes(xlim=(10, 110), ylim=(-40, 60)) 
ax.set_aspect('equal') 
line, = ax.plot([],[], lw=2) 

def init(): 
    line.set_data([],[]) 
    return line, 

def animate(i): 
    c1 = 62.5 
    c2 = 10 
    pt_rot = (c1, c2) 
    x = [47.5, 47.5, 77.5, 77.5, 47.5, 62.5, c1, 57.5, 67.5] 
    y = [15, 45, 45, 15, 15, 15, c2, 10, 10] 

    x,y = center(x,y,pt_rot) # <--------------------- here 
    x,y = rotation(x,y,(i/180.)*np.pi) # <------------ here 
    x,y = recenter(x, y, pt_rot) # <------------------ here 

    line.set_data(x,y) 
    return line, 


anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=359, interval=20, blit=True) 

plt.show() 
+0

謝謝。這是一個愚蠢的錯誤。我會按照您的建議返回「無」。 –

+0

如果這解決了您的問題,您可以[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work),使問題不會留在未解決的名單。 – ImportanceOfBeingErnest