如何获得在python中旋转一条直线的角度

问题描述:

我有一条线用两点[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() 

我对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