Graphics2D:如何在不规则形状周围创建一致的填充?

时间:2013-03-13 13:25:26

标签: java awt zoom graphics2d

我正在使用Java Graphics2D生成这个地图,上面有一些有色的红色覆盖。如您所见,叠加层沿左侧的图像边界被截断: -

enter image description here

向我的项目利益相关者演示此内容之后,他们想要的是这个叠加层沿着地图边界剪切,并围绕它进行一些一致的填充。这样做的简单原因是为用户提供叠加层扩展到地图之外的想法。

所以,我最初的想法是通过创建另一个更大的地图作为“千篇一律”来执行“缩放和移位”,这是我的简化代码: -

// polygon of the map
Polygon minnesotaPolygon = ...;

// convert polygon to area
Area minnesotaArea = new Area();
minnesotaArea.add(new Area(minnesotaPolygon));

// this represents the whole image
Area wholeImageArea = new Area(new Rectangle(mapWidth, mapHeight));

// zoom in by 8%
double zoom = 1.08;

// performing "zoom and shift"
Rectangle bound = minnesotaArea.getBounds();
AffineTransform affineTransform = new AffineTransform(g.getTransform());
affineTransform.translate(-((bound.getWidth() * zoom) - bound.getWidth()) / 2,
                          -((bound.getHeight() * zoom) - bound.getHeight()) / 2);
affineTransform.scale(zoom, zoom);
minnesotaArea.transform(affineTransform);

// using it as a cookie cutter
wholeImageArea.subtract(minnesotaArea);

g.setColor(Color.GREEN);
g.fill(wholeImageArea);

我用绿色填充外部部分的原因是让我看看饼干切割器是否正确实施。结果如下: -

enter image description here

如您所见,“缩放和移位”在这种情况下不起作用。右下方绝对没有填充物。然后,我意识到这种技术不适用于不规则形状,如地图......它只适用于更简单的形状,如方形,圆形等。

我想要的是在剪掉其余部分之前在地图周围创建一致的填充/边距。为了确保你理解我在这里说的话,我在下面的照片中写下了这些图片(尽管做得不好),以解释我在这里想要完成的事情: -

enter image description here

我不确定如何从这里开始,我希望你们能就此提供一些指导。

感谢。

1 个答案:

答案 0 :(得分:1)

我只是解释逻辑,因为我没有时间自己编写代码。简短的回答是你应该逐步浏览地图图像的每个像素,如果周围区域中的任何像素(即一定距离)被认为是“陆地”,那么你将当前像素注册为部分填充区域。

总的来说,这是实现目标的9个步骤。

1。确定填充的大小。我们说6像素。

2。以单色创建地图的图像(黑色是“水”,白色是“土地”)。在边缘周围留出至少6个像素的边距。这是输入图像:(不是按比例)

black and white map

3。创建一个直径为11像素的圆形图像(11 = 6 * 2-1)。同样,黑色是空的/透明的,白色是实心的。这是命中区域图像:

11 pixel wide circle

4。创建一个全黑的第三张图片(开头)。使其与输入图像的大小相同。它将用作输出图像。

5。迭代输入图像的每个像素。

6。在该像素处覆盖命中区域图像(仅通过计算实际上这样做),使得命中区域(白色圆圈)的中心在当前输入图像像素上。

7。现在迭代命中区域图像的每个像素。

8。如果命中区域图像的任何白色像素与输入图像的白色像素相交,则将白色像素(圆圈的中心)绘制到输出图像中。

9。转到第5步。

不可否认,从第6步开始,它并不是那么简单,但应该相当容易实现。希望你理解逻辑。如果我的解释太混乱(抱歉),那么我可以花一些时间编写完整的解决方案(在Javascript,C#或Haskell中)。