我有一个声明有两个点[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()
答案 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)之间的距离来平移两个点。