2010-02-04 6 views
3

마우스 움직임을 통해 이미지를 회전시키는 논리는 무엇입니까? graphics2d.rotate를 사용하여 회전하는 방법을 알고 있지만 마우스를 회전 원으로 사용하는 데 어려움이 있습니다.Java 2D - 마우스를 드래그하여 이미지를 부드럽게 회전

  1. GET 마우스 X (DX) 및 ( 우리가 회전 할 이미지의 중심이 될 것입니다이 경우) 지점을 고정에서 마우스 Y (DY) 거리 : 여기에 기본 단계이다.
  2. Math.arcTan2 (dy, dx)에서이 점을 사용하여 각도 또는 회전을 얻습니다.
  3. Graphics2D.rotate 메소드의 step to 값을 사용하십시오.

이러한 전략을 사용하면 이미지를 회전 할 때마다 이미지가 -pi에서 회전하기 시작하고 90도 회전 한 후 다시 -pi로 이동합니다. 나는 내가 여기서 잘못하고있는 것을 이해하지 못한다. 그것은 꽤 기초적이어야한다. 여기

는 코드의 일부이다 :

// mouse dragged events get sent here. 
public void mouseDragged(MouseEvent e) { 
    int mx = e.getX(), my = e.getY(); 
    // just checking if it falls within bounds of the image we 
    // want to rotate. 
    if(mx > speedKX || mx < speedKX + speedK.getWidth() || my > speedKY || my < speedKY + speedK.getHeight()/2) 
    { 
     theta += getTheta(e.getX(), e.getY()); 
    } 
} 
+0

일부 코드를 볼 수 있습니까? 삼각법 문제처럼 보입니다 ... –

+0

예, 여기서 확실하게, 여기 : // 마우스 끌기 이벤트가 여기에 전송됩니다. public void mouseDragged (MouseEvent e) { int mx = e.getX(), my = e.getY(); // 이미지의 경계 내에 있는지 확인합니다. // 회전시키고 자합니다. if (mx> speedKX || mx speedKY || my dave

+0

왜 그런지 잘 모르겠지만 이전 의견은 제대로 표시되지 않았습니다. 읽어 보시겠습니까? 감사하지 않으면 감사드립니다. – dave

답변

4

나는 현재의 각도 (당신이 앵커와 클릭 사이의 선을 클릭하면) 초기 각도를 찾아야한다 알고있는 것처럼 (당신을 드래그, 같은 라인). 이 앵글 (앵커 포인트까지의 현재 거리와 관계 없음)은 회전을 제공합니다.

그래서, 당신은에 :

rotate(anglenow - angle0) 

를 찾는 방법 : 두 경우 모두

(초기 클릭 및 마우스 이동 이벤트를) 당신이 앵커로 생각 앵커와 마우스 포인트 사이의 각도를 찾을 수있다 기원.

I는 아크 탄젠트 (DY/DX)를 계산한다)와 동일한 X 또는 동일한 예를 쉽게 검출 등 레이스 조건을 제외하고 방법 (getAngle (X1, Y1, X2, Y2). 즉, 방법 (사용하는 것이

.

로그인

하지만 DY을 분할 할 때 /이 될 수있다 DX :.

그것은이다
+/+ -> + 
+/- -> - 
-/+ -> - 
-/- -> + 

, 네 posibilities 그래서, 당신이 그들을 감지하는 몇 가지 조건을 볼 필요가 당신에게 결과의 두 종류를 제공 .

arctan doc 또는 source를 검토하여 arctan이 반환하는 값 (0과 pi 또는 -pi/2와 + pi/2 사이)을 확인하고 dx 또는 dy의 부호를 확인하십시오 (arctan이 반환하는 범위에 따라 다름)) 그리고이를 사용하여 pi를 더하거나 내리면 결과 각도가됩니다.

그러면 360º 공간을 올바르게 반환하는 getAngle 메서드가 생깁니다.

편집

자바 독 말한다 :

Math.atan이 -pi/2 ~ pi/2의 범위에서, 각도의 아크 탄젠트 retuns.

그래서 제가 생각한대로 값 0의 각도가 X 축에 있다고 가정하면 반환하는 범위는 오른쪽 반구입니다.그래서 당신은 왼쪽 반구와 오른쪽 반구를 구별해야합니다.

dx = xtarget - xorigin을 계산하면 (올바른 분지가 올바른 경우) 양수가되고, 그렇지 않으면 음수가됩니다.

만약 dy가 <이라면 결과 각도에 pi를 더해야합니다. -pi/2 ~ 3pi/2 사이입니다. 모두를 (-pi, pi) 범위 또는 (0,2pi) 범위로 전달하여 결과를 수정할 수도 있습니다.

편집 : 의사 코드를 다시 확인하십시오!

onmousedown { 
    startpoint = (x,y); 
    startangle = getAngle(origin, startpoint); 
} 

onmousemove { 
    currentpoint = (x,y); 
    currentangle = getAngle(origin, currentpoint); 
    originalimage.rotate(currentangle - startangle); 
} 

getAngle(origin, other) { 
    dy = other.y - origin.y; 
    dx = other.x - origin.x; 
    if (dx == 0) // special case 
     angle = dy >= 0? PI/2: -PI/2; 
    else 
    { 
     angle = Math.atan(dy/dx); 
     if (dx < 0) // hemisphere correction 
      angle += PI; 
    } 
    // all between 0 and 2PI 
    if (angle < 0) // between -PI/2 and 0 
     angle += 2*PI; 
    return angle; 
} 
+0

와우,이 사이트에 대한 즉각적인 expereinced 피드백을 정말 좋아해요! 그리고 나는 그것을 정말로 빨리 시험해 보게한다. – dave

+0

thats 다른 문제는 java의 arctan2 (dy, dx) 메서드는 pi와 pi 사이의 값을 반환합니다. – dave

+0

-PI 대 PI = 전체 원 : – helios