2010-01-03 2 views
4

나는 그리기 프로그램을 쓰고 있어요, 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)) 
: 나는 마우스 위치

내 코드에 관련 이미지를 회전 할 수있는 적절한 논리를 알아낼 수 없습니다이 비슷한입니다

기본적으로 사용자가 마우스를 움직이면 이미지 회전 각도가 계속 증가합니다. 그러나 이것은 때때로 이미지를 90도 회전시키기 위해 마우스를 여러 번 "동그라미"해야한다는 것을 의미합니다.

그러나 다른 프로그램과 유사하게 이미지가 마우스의 위치와 관련하여 어떻게 회전해야합니까? 이미지의 위치.

이것이 문제가되는 비트입니다. 그것이 내가 resize()마다 마우스 움직임을 업데이트라고 믿고있어 어떤 언어

답변

6

에 적용 할 수 파이썬과 wxPython을을 사용하지만 나는, 언어 독립적 인 질문을 떠 났어요. 문제는 self.angle += 1 인 것 같습니다. 마우스 이벤트마다 각도를 1 도씩 업데이트 할 수 있습니다.

문제를 해결할 수있는 방법은 다음과 같습니다. 회전 할 이미지의 중심점을 선택하십시오 (이 경우 (0,0) 점은 self.img.Rotate()에 있지만 보통 이미지의 중심 임). 회전 각도는이 지점에서 마우스 커서로가는 각도에서 사용자가 클릭 할 때이 지점에서 마우스 위치로가는 선이 이루는 각도를 뺀 각도 여야합니다.

두 점 사이의 각도를 계산하려면 각도를 라디안으로 표시하는 math.atan2(y2-y1, x2-x1)을 사용하십시오. 마우스 위치 축에 따라 뺄셈 순서를 변경해야 할 수도 있습니다.

+0

감사합니다, 나는 그것을 시도 갈거야, 결국 솔루션입니다.나는 그 문제에 접근하는 방법을 모르기 때문에 각도를 1로 사용했습니다. 잘 잡는 (0, 0) 역시 이미지 센터를 계산하는 것을 잊어 버렸고 이미지의 왼쪽 상단 주위를 회전시켰다. 고맙습니다. –

1

fserb의 솔루션은 내가 너무 회전에 대해 갈 것이 방법이지만, 고려 추가 뭔가의 사용이다 :

당신은 모든 마우스 드래그 이벤트에 대한 응답으로 비트 맵 이미지 회전을 수행하는 경우
img = self.img.Rotate(rad, (0, 0)) 

, 당신은 회전에 필요한 모든 보간의 결합 된 효과로부터 많은 데이터 손실을 가져올 것입니다. 예를 들어 1도 360도 회전하면 원래 이미지보다 훨씬 흐릿한 이미지를 얻을 수 있습니다.

이 같은 회전 시스템 무언가를 가진보십시오 : 당신이 회전 모드에있는 동안
display_img = self.img.Rotate(rad, pos) 

는 다음 display_img 이미지를 사용합니다. 회전 모드 ( onMouseUp 일 가능성이 있음)를 종료하면 img = display_img입니다.

사용자 미리보기로 손실되는 작업이있을 때마다 이러한 유형의 전략이 유용합니다.

+0

감사합니다. 좋은 생각입니다. 투명한 다각형을 사용하여 사용자가 마우스를 움직일 때 회전하고 나서 마우스 버튼을 놓을 때만 회전을 할 것입니다. 회전하는 이미지를 표시하기에는 너무 힘이들 것입니다. –

+0

성능에 따라 회전 된 이미지의 저해상도 버전을 표시합니다. – tkerwin

0

여기

def rotate(self, position, origin): 
    """ position: mouse x/y position, origin: x/y to rotate around""" 
    origin_angle = self.find_angle(origin, self.center) 
    mouse_angle = self.find_angle(position, self.center) 

    angle = mouse_angle - origin_angle 
    # do the rotation here 


def find_angle(self, a, b): 
    try: 
     answer = math.atan2((a[0] - b[0]) , (a[1] - b[1])) 
    except: 
     answer = 0 
    return answer 
관련 문제