2012-05-10 3 views
3

Canvas 객체 (선, 꼭지점, 삼각형 등)를 만들고 있는데, 한 점을 중심으로 회전을 적용하고 싶습니다.Java로 점 주위의 다각형을 회전하는 방법은 무엇입니까?

점은지도에 GeoPoint의에 연결되어 있기 때문에이 모든지도가 회전 회전() 메소드를 사용, 그래서 만약 내가 캔버스의 rotate() 메서드를 사용할 수 없습니다

...

문제는 Canvas가 Point (int, int)를 필요로하고 회전을 적용하면 cos 및 sin 함수 때문에 double이 생성됩니다. 그래서 int로 double을 캐스팅했기 때문에 모든 포인트에 회전을 적용하면 어떤 그래픽 문제가 발생합니다 ...

그래서 가장 좋은 해결책을 찾고 있습니다. 여기

내 회전 코드 :

public Point rotatePoint(Point pt, Point center) 
{ 
    this.angle = ((this.angle/180)*Math.PI); 
    double cosAngle = Math.cos(this.angle); 
    double sinAngle = Math.sin(this.angle); 

    pt.x = center.x + (int) ((pt.x-center.x)*cosAngle-(pt.y-center.y)*sinAngle); 
    pt.y = center.y + (int) ((pt.x-center.x)*sinAngle+(pt.y-center.y)*cosAngle); 
    return pt; 
} 

답변

1

나는 당신의 솔루션은 꽤 좋은 생각합니다. 작은 개선은 정수로 캐스팅하기 전에 좌표에 0.5를 더하는 것이고 우리는 일반적으로 사용되는 반올림을 갖습니다. 예를 들어 0.5 이상은 1로 반올림됩니다. 그 외에는 연속 된 공간을 이산 된 공간 (즉, 캔버스에 대한 평면)에 배치하려는 경우 반올림을 수행하지 않아도된다고 생각하지 않습니다.

+0

좋아, 내가 실수를 수정, 편집이 내 게시물을했습니다, 당신은 당신의 응답을 @izomorphius 감사합니다 :) 사본을 수행/:

public Point rotatePoint(Point pt, Point center) { this.angle = ((this.angle/180)*Math.PI); double cosAngle = Math.cos(this.angle); double sinAngle = Math.sin(this.angle); double dx = (pt.x-center.x); double dy = (pt.y-center.y); pt.x = center.x + (int) (dx*cosAngle-dy*sinAngle); pt.y = center.y + (int) (dx*sinAngle+dy*cosAngle); return pt; } 

나는 또한 다음과 같은 변화를 사용하는 대신 다음을 시도 붙여 넣기 – Bibu

5

코드에 pt.y를 계산할 때 작은 버그가 있습니다. (pt.x는 업데이트되었지만 나중에 사용됩니다).

public Point rotatePoint(Point pt, Point center, double angleDeg) 
{ 
    double angleRad = (angleDeg/180)*Math.PI); 
    double cosAngle = Math.cos(angleRad); 
    double sinAngle = Math.sin(angleRad); 
    double dx = (pt.x-center.x); 
    double dy = (pt.y-center.y); 

    pt.x = center.x + (int) (dx*cosAngle-dy*sinAngle); 
    pt.y = center.y + (int) (dx*sinAngle+dy*cosAngle); 
    return pt; 
} 
+1

"다음 변형"을 테스트했습니다. 공장! –

관련 문제