2014-06-07 3 views
0

주어진 다각형을 주어진 거리와 같은 중심으로 다른 방향으로 그리는 자바 방법이 있는지 알고 싶습니다.Java 2D Polygon outside another

AffineTransform을 시도했지만 어떻게 작동하는지 실제로 알지 못합니다.

감사합니다.

+0

g2.translate (X, Y)이; g2.draw (다각형)는 변환에만 관심이있는 경우 변환 행렬을 사용하는 것보다 간단 할 수 있습니다. –

+0

John, 미안, 나는 충분히 명확하지 않았다. 아이디어는 다른 하나의 외부에서 두 번째 다각형을 만들지 만 동일한 중심과 두 배의 크기를 사용하는 것입니다. 감사합니다. – Ramon

+0

g2.scale (2,2); g2.draw (다각형); 그럴 경우. 변환, 축척, 전단, 회전 및 뒤집기를 하나의 작업으로 결합하려는 경우 AffineTransform과 변형 행렬을 사용합니다. –

답변

0

폴리곤의 중심 높이와 높이의 절반으로 변환해야합니다. http://paulbourke.net/geometry/polygonmesh/PolygonUtilities.java에서 오는 코드를 포함하여 다각형의 중심을 계산했습니다.

public void drawPolygon(){ 
    Graphics2D g2 = bufferedImage.createGraphics(); 
    Polygon poly=new Polygon(); 
    poly.addPoint(100, 100); 
    poly.addPoint(200, 100); 
    poly.addPoint(200, 200); 
    poly.addPoint(150, 250); 
    poly.addPoint(100, 200); 
    poly.addPoint(100, 100); 

    g2.setColor(Color.blue); 
    g2.fillPolygon(poly);   
    g2.setColor(Color.red); 

    Point2D.Double []pts=new Point2D.Double[poly.npoints]; 

    for (int i=0;i<poly.npoints;i++){ 
     pts[i]=new Point2D.Double(poly.xpoints[i],poly.ypoints[i]);    
    } 

    Point2D centroid=centerOfMass(pts); 

    g2.translate(-centroid.getX(), -centroid.getY()); 
    g2.scale(2, 2); 

    g2.drawPolygon(poly);   
} 

public static double area(Point2D[] polyPoints) { 
    int i, j, n = polyPoints.length; 
    double area = 0; 

    for (i = 0; i < n; i++) { 
     j = (i + 1) % n; 
     area += polyPoints[i].getX() * polyPoints[j].getY(); 
     area -= polyPoints[j].getX() * polyPoints[i].getY(); 
    } 
    area /= 2.0; 
    return (area); 
} 

/** 
* Function to calculate the center of mass for a given polygon, according 
* to the algorithm defined at 
* http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ 
* 
* @param polyPoints 
* array of points in the polygon 
* @return point that is the center of mass 
*/ 

public static Point2D centerOfMass(Point2D[] polyPoints) { 
    double cx = 0, cy = 0; 
    double area = area(polyPoints); 
    // could change this to Point2D.Float if you want to use less memory 
    Point2D res = new Point2D.Double(); 
    int i, j, n = polyPoints.length; 
    double factor = 0; 
    for (i = 0; i < n; i++) { 
     j = (i + 1) % n; 
     factor = (polyPoints[i].getX() * polyPoints[j].getY() 
      - polyPoints[j].getX() * polyPoints[i].getY()); 
     cx += (polyPoints[i].getX() + polyPoints[j].getX()) * factor; 
     cy += (polyPoints[i].getY() + polyPoints[j].getY()) * factor; 
    } 
    area *= 6.0f; 
    factor = 1/area; 
    cx *= factor; 
    cy *= factor; 
    res.setLocation(cx, cy); 
    return res; 
} 

GIS 세계에서 공통점이있는 또 다른 방법은 다각형을 버퍼링하는 것입니다. Java Topology Suite 라이브러리는이 기능을 제공하지만 스케일 팩터가 무엇인지 알아내는 것이 더 어려울 수도 있습니다.

이 게시물에서 성장 다각형에 대한 몇 가지 흥미로운 토론이 있습니다 An algorithm for inflating/deflating (offsetting, buffering) polygons