用鼠标旋转图像

Ste*_*oat 4 mouse image rotation

我正在写一个绘图程序,Whyteboard - http://code.google.com/p/whyteboard/

我已经实现了图像旋转功能,除了它的行为有点奇怪.我无法弄清楚使图像相对于鼠标位置旋转的正确逻辑

我的代码与此类似:

(这些是从鼠标事件处理程序调用的)

def resize(self, x, y, direction=None):
    """Rotate the image"""
    self.angle += 1
    if self.angle > 360:
        self.angle = 0
    self.rotate()


def rotate(self, angle=None):
    """Rotate the image (in radians), turn it back into a bitmap"""
    rad = (2 * math.pi * self.angle) / 360
    if angle:
        rad = (2 * math.pi * angle) / 360
    img = self.img.Rotate(rad, (0, 0))
Run Code Online (Sandbox Code Playgroud)

因此,当用户移动鼠标时,基本上旋转图像的角度会不断增加.但是,这有时意味着您必须多次"圈"鼠标才能将图像旋转90度,更不用说360度了.

但是,我需要它与其他程序类似 - 图像如何相对于鼠标在图像上的位置旋转.

这是我遇到麻烦的一点.我已经离开了与语言无关的问题,尽管使用Python和wxPython它可以适用于任何语言

fse*_*erb 6

我假设resize()每次鼠标移动更新都会被调用.您的问题似乎是self.angle += 1,这使您在每次鼠标事件时将角度更新1度.

问题的解决方案是:在图像上选择旋转将居中的点(在这种情况下,它是你的(0,0)self.img.Rotate(),但通常它是图像的中心).旋转角度应该是从该点到鼠标光标的线形成的角度减去用户单击时从该点到鼠标位置的线形成的角度.

要计算两点之间的角度,使用math.atan2(y2-y1, x2-x1)它将以弧度为单位给出角度.(您可能需要根据鼠标位置轴更改减法的顺序).