Java 2D Polygon在另一个之外

时间:2014-06-07 18:11:29

标签: graphics2d affinetransform

我想知道是否有一种java方式,给定一个多边形,在给定距离和相同的中心绘制另一个。

我尝试了AffineTransform,但并不知道它是如何工作的。

谢谢。

1 个答案:

答案 0 :(得分: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