2014-10-24 3 views
1

자바에서 도형의 크기를 조절하려고했지만 몇 가지 문제가 있습니다. 내가 그것을 시도 할 때 모양이 단순 dissapears ...이 방법은 2 점을받습니다, toScale 내가 모양을 확장하려면 원하는 지점이며, p1 내가 선택한 모양 주위에있는 사각형을 클릭 한 지점입니다 (거기에 모양을 둘러싼 사각형 (BoundingBox의)는 처리 여부 POLYGONE 또는 사각형하거나 폴리 라인)메서드 규모가 작동하지 않습니다. 무엇이 문제입니까?

여기 스케일 방법 코드입니다입니다 : 어떤 도움이 사전에 감사 감사하겠습니다

public void scale(Point toScale, Point p1) { 
     Graphics g = parent.getGraphics(); 
     int distanceToClicked = 0; 
     int distanceToBoundingBox = 0; 
     int scaleFactor = 0; 
     Vector<Point> pointsAux = new Vector<Point>();   

     Iterator<Point> it = points.iterator(); 
     while (it.hasNext()){ 
      Point p = it.next(); 
      distanceToClicked = (int) Math.sqrt(Math.pow(getCentroid().getX()-p1.getX(), 2)+Math.pow(getCentroid().getY()-p1.getY(),2)); 
      distanceToBoundingBox = (int) Math.sqrt(Math.pow(getCentroid().getX()-toScale.getX(),2)+Math.pow(getCentroid().getY()-toScale.getY(),2)); 
      scaleFactor = distanceToClicked/distanceToBoundingBox; 
      p = new Point((int)p.getX()*scaleFactor,(int) p.getY()*scaleFactor); 
      pointsAux.add(p); 
     } 
     points.clear(); 
     points.addAll(pointsAux); 
    } 

public Point getCentroid(){ 
     int sumx = 0; 
     int sumy = 0; 
     for(int i = 0; i<points.size();i++){ 
      sumx+=points.get(i).getX(); 
      sumy+=points.get(i).getY(); 
     } 
     Point centroid = new Point(sumx/points.size(), sumy/points.size()); 
     return centroid; 
    } 

가, 결국 나는 ' 오해의 코드에 대해 미안합니다

+0

단일 스레드 시나리오에서 벡터 수집을 사용하지 마십시오. ArrayList를 사용하십시오. – sturcotte06

+0

어떤 방식으로 작동하지 않습니까? 지금까지 작동 시키려고 시도한 것은 무엇입니까? – pquest

+0

왜 @ sturcotte06입니까? – pMpC

답변

1

트릭을 할만한 것 :

public Collection<Point> scaleShape(float scale, Collection<Point> shape) { 
    Point centroid = getCentroid(); 
    Collection<Point> scaledShape = new ArrayList<>(shape.size()); 

    for (Point point : shape) { 
     Point diff = new Point(point.x() - centroid.x(), point.y() - centroid.y()); 
     Point scaledPoint = new Point(
      (int) (centroid.x() + scale * diff.x()), 
      (int) (centroid.y() + scale * diff.y())); 

     scaledShape.add(scaledPoint); 
    } 

    return scaledShape; 
} 

기본적으로 모든 점은 중심점과 선형 함수를 만듭니다. Centroid의 상대 x = 0, 현재 계산 된 점이 상대 x = 1에있는 경우 상대 x = 스케일 인 경우 점을 찾고 싶습니다.

관련 문제