如何在python中获取旋转线的角度

时间:2014-10-09 03:57:51

标签: python rotation tkinter

我有一个声明有两个点[x1,y1,x2,y2]的线,我有一个新点(Nx,Ny),我必须首先旋转线然后朝它移动。

这是一张清楚的图片: enter image description here

我尝试过这个功能,但是我无法完成轮换,我使用的是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 个答案:

答案 0 :(得分:1)

我不熟悉TkInter,但通过做出有根据的猜测,似乎self.panel.coords的输入是该行和四个坐标的句柄。通过将co-ords设置为(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)之间的距离来平移两个点。