Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中获取旋转直线的角度_Python_Rotation_Tkinter - Fatal编程技术网

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

如何在python中获取旋转直线的角度,python,rotation,tkinter,Python,Rotation,Tkinter,我用两点[x1,y1,x2,y2]声明了一条线,我有一个新的点(Nx,Ny),我必须首先旋转这条线,然后朝着它移动 下面是一张清晰的图片: 我尝试过这个函数,但无法完成旋转,我使用的是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 "ang

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

下面是一张清晰的图片:

我尝试过这个函数,但无法完成旋转,我使用的是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)之间的距离平移两个点。

您好,谢谢您的回答。我应该在保持长度的同时旋转直线,然后向新的点移动。我试着按照你的建议去做,但是直线正在收缩。我不明白为什么直线会收缩,因为不管角度是什么,这个公式应该始终保持线段的长度。。。这是一个数学事实!我对self.panel.coords输入的假设正确吗?您好!我没有添加你给我的newx公式。是我的错。现在它没有缩小:)关于角度的另一个评论。如果您使用的是arctan2,那么第一个变量是“相反”边的长度,第二个变量是“相邻”边的长度。相反的是(nx,ny)和(x2,y2)之间的直线,相邻的是(x1,y1)和(x2,y2)之间的直线。确保你做对了,整个事情都会成功的。