2014-10-09 279 views
1

我有一條線用兩點[x1,y1,x2,y2]聲明,並且我有一個新點(Nx,Ny),我必須先將它旋轉然後將它移向它。如何獲得在python中旋轉一條直線的角度

這裏'山的圖片得到明確: enter image description here

我曾嘗試使用此功能,但我不能設法完成旋轉,I'm使用Tkinter的和Python:

def rotateLine(self,dx,dy): # x and y are the differences between x1,nx and y1,ny 
      angle= math.atan2(dy,dx) 
      print "angle",angle 
      newx = ((x1)*math.cos(angle)-(y1)*math.sin(angle)) 
      newy = ((x1)*math.sin(angle)+(y1)*math.cos(angle)) 
      self.panel.coords(self.robot,newx,newy,newx+10,newy+30) # I always add 10 in x and 30 in y to maintain de size of the line 
      self.panel.update() 

回答

1

我對TkInter並不熟悉,但通過進行有根據的猜測,似乎self.panel.coords的輸入是線和四個座標的句柄。通過將協調角色設置爲(x,y,x + 10,y + 30),您總是會有一個具有相同長度和角度的線段,您實際設置的唯一東西就是線條的原點。

你是否應該從(x1,y1)到(nx,ny)的直線伸展或沿着點之間的直線移動線段?另外,當你計算newx和newy時,你需要將它集中在點(x1,y1)上。因此,您擁有的每個地方(x1)都需要(x2-x1),並且y1需要類似。您還需要重新添加x1和y1,因爲您正在使用的公式是關於原點的旋轉。然後,方程式應該是

newx = ((x2-x1)*math.cos(angle)-(y2-y1)*math.sin(angle)) + x1 
newy = ((x2-x1)*math.sin(angle)+(y2-y1)*math.cos(angle)) + y1 

如果你想要做的第一件事就是旋轉邁向新點的線段,那麼你應該嘗試

self.panel.coords(self.robot,x1,y1,newx,newy) 

線的長度的保存應已經保存在你的新點的計算中。移動線段是一個簡單的問題,它使用來自垂直方向的角度以及(newx,newy)和(Nx,Ny)之間的距離來平移兩個點。

+0

你好,謝謝你的回答。我應該在保持長度的情況下旋轉線條,然後向新的點移動。我正在嘗試做你的建議,但是線路正在縮小。 – 2014-10-09 04:36:37

+0

我不明白爲什麼線會縮小,因爲不管角度是什麼,該公式應始終保持線段的長度......這是一個數學事實!我對self.panel.coords的輸入的假設是否正確? – RoBDoG 2014-10-09 04:57:43

+0

你好!我沒有添加你給我的newx公式。我的錯 。現在它不縮水:) – 2014-10-09 04:59:35