2013-08-15 3 views
1

다각형을 사용하여 몇 가지 테스트를하고 있습니다. 회전하는 동안 문제가 발생했습니다. 문제는 다각형이 회전 할 때 움직이는 것처럼 보이고 결국 화면 밖으로 튀어 나오는 문제입니다. 나는 그들을 회전시키기 위해 AffineTransform을 사용하고 있었고, 움직이지 않아야하므로 그들을 번역하지 않았습니다. 다음은 코드입니다 :회전하는 동안 다각형이 이동합니다.

import java.awt.*; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Point2D; 

public class PhysicsProp { 
    Point2D[] OriginalPoints; 
    Point2D[] NewPoints = OriginalPoints; 

    int X; 
    int Y; 

    double rotation = 0.0; 

    public PhysicsProp(Point2D[] Points){ 
     OriginalPoints = Points; 
     NewPoints = Points; 
    } 

    public Polygon PointsToPoly(Point2D[] Points){ 
     Polygon p = new Polygon(); 
     for (int i = 0; i < Points.length; i++){ 
      p.addPoint((int) Points[i].getX(), (int) Points[i].getY()); 
     } 
     return p; 
    } 

    public void rotateModel(double theta){ 
     AffineTransform.getRotateInstance(Math.toDegrees(theta), PointsToPoly(NewPoints).getBounds().getCenterX(), PointsToPoly(NewPoints).getBounds().getCenterY()).transform(OriginalPoints, 0, NewPoints, 0, OriginalPoints.length); 
    } 

    public Polygon getModel(){ 
     return PointsToPoly(NewPoints); 
    } 

    public void setModel(Point[] points){ 
     OriginalPoints = points; 
    } 

    public Rectangle getBounds(){ 
     return PointsToPoly(NewPoints).getBounds(); 
    } 
} 

내가 실제로이 코드로 잘못 무슨 일이 일어나고 있는지 알고 싶습니다, 내가 (회전 다각형)을 달성하기 위해 노력하고있어 주위에 더 좋은 방법이 있다면. 다음은 다각형을 렌더링하고 회전하는 위치입니다.

g2.setColor(Color.pink); 
      for (PhysicsProp p : CurrentLevel.PhysicsObjects){ 
       g2.drawPolygon(p.PointsToPoly(p.NewPoints)); 
       p.rotateModel(0.001); 
      } 

어떤 도움을 주셔서 감사합니다!

+1

다각형의 중심점은 무엇입니까? –

+1

다각형의 중심점 캐싱을 시도하고 항상 캐시 된 점을 회전 할 지점으로 사용하십시오. 임의의 회전에서 임의의 다각형에 대해 동일한 정확한 X/Y 중심점을 계산하므로 위험 (및 CPU주기)을 제거하고 한 번 캐시 한 다음 다시 사용하면됩니다. – Tim

+1

+1 @Tim (답변으로 게시해야하는 사람). 끊임없이 회전하여 중심을 다시 계산하면 반올림/정밀도 오류로 인해 중심이 표류합니다. 또는 현재 변환을 저장하고 회전 할 때마다 점진적으로 변환을 업데이트하면 한 번에 한 단계 씩 모델을 수정하는 대신 원본 모델에 완전히 업데이트 된 변환을 적용 할 수 있습니다. –

답변

4

다각형의 중심점을 캐싱하고 항상 캐시 된 점을 회전 할 지점으로 사용하십시오. 임의의 회전에서 임의의 다각형에 대해 동일한 정확한 X/Y 중심점을 계산하므로 위험 (및 CPU주기)을 제거하고 한 번 캐시 한 다음 다시 사용하면됩니다.

+0

중심점은 다각형의 위치에 상대적이어야합니까? – cstream24

+0

방금 ​​해 주셨습니다. 도움을 주셔서 대단히 감사합니다! 내가 할 수 있으면 upvote 줄. – cstream24

+0

도움이 되니 기쁩니다! OP로, 아직 upvote 수없는 경우에도 대답을 수락하실 수 있습니다. 그러나 @Jason C가 중심점을 캐싱하는 대신 변환을 캐싱한다는 제안은 성능 관점에서 보는 것보다 낫습니다. 따라서이 방법을 시도해 보시기 바랍니다. – Tim

관련 문제