4

我正在使用 Java Graphics2D 生成这张地图,上面有某种着色的红色叠加层。如您所见,叠加层沿左侧的图像边界被切断:-

在此处输入图像描述

在向我的项目利益相关者演示后,他们想要的是让这个叠加层沿着地图边界剪辑,并在其周围进行一些一致的填充。这样做的简单原因是让用户知道叠加层延伸到地图之外。

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

// 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);

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

在此处输入图像描述

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

我想要的是在裁剪其余部分之前在地图周围创建一致的填充/边距。为了确保您理解我在这里所说的内容,我在下面对这张图片进行了 photoshop 处理(尽管做得不好),以解释我在这里要完成的工作:-

在此处输入图像描述

我不知道如何从这里开始,我希望你们能给我一些指导。

谢谢。

4

1 回答 1

1

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

对于长答案,这里有 9 个步骤来实现你的目标。

1.确定填充的大小。比方说6像素。

2. 创建单色地图图像(黑色为“水”,白色为“陆地”)。在边缘周围留出至少 6 像素的边距。这是输入图像:(未按比例缩放)

黑白地图

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

11像素宽的圆圈

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

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

6. 在该像素处覆盖命中区域图像(仅通过计算虚拟地执行此操作),以便命中区域(白色圆圈)的中心位于当前输入图像像素之上。

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

8. 如果命中区域图像的任何白色像素与输入图像的白色像素相交,则在输出图像中绘制一个白色像素(圆心所在的位置)。

9. 转到步骤 5。

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

于 2013-03-25T23:45:36.923 回答