public static Area punch(Area shapeArea,double gap,boolean rounded,Point2D pointPos,Shape pointShape){
  if (gap <= 1e-10 || pointPos == null || pointShape == null) {
    return shapeArea;
  }
  AffineTransform tx=AffineTransform.getTranslateInstance(pointPos.getX(),pointPos.getY());
  int gapJoin=rounded ? BasicStroke.JOIN_ROUND : BasicStroke.JOIN_MITER;
  Area gapArea=GeometryUtils.grow(tx.createTransformedShape(pointShape),gap,gapJoin,10f);
  shapeArea.subtract(gapArea);
  return shapeArea;
}

public static Area punch ( Area shapeArea , double gap , boolean rounded , Point2D pointPos , Shape pointShape ) { if ( gap <= 1e-10 || pointPos == null || pointShape == null ) { return shapeArea ; } AffineTransform tx = AffineTransform . getTranslateInstance ( pointPos . getX ( ) , pointPos . getY ( ) ) ; int gapJoin = rounded ? BasicStroke . JOIN_ROUND : BasicStroke . JOIN_MITER ; Area gapArea = GeometryUtils . grow ( tx . createTransformedShape ( pointShape ) , gap , gapJoin , 10f ) ; shapeArea . subtract ( gapArea ) ; return shapeArea ; }
subtract a specified geometric area of data points from another shape to yield gaps .
