我正在使用 Java Graphics2D 生成这张 map ,上面覆盖了某种有色红色。如您所见,叠加层在左侧沿图像边界被切断:-
在向我的项目利益相关者演示后,他们想要的是这个叠加层沿着 map 边界裁剪,周围有一些一致的填充。这样做的原因很简单,就是让用户觉得叠加层延伸到了 map 之外。
所以,我最初的想法是通过创建另一个更大的 map 作为“千篇一律”来执行“缩放和移动”,这是我的简化代码:-
// 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);
我用绿色填充外部部分的原因是让我看看曲奇刀是否正确实现。这是结果:-
如您所见,“缩放和移动”在这种情况下不起作用。右下角绝对没有填充。然后,我意识到这种技术不适用于不规则的形状,例如 map ...它只适用于更简单的形状,例如正方形、圆形等。
我想要的是在裁掉其余部分之前在 map 周围创建一致的填充/边距。为了确保您理解我在这里所说的内容,我对下面的这张图片进行了 Photoshop 处理(尽管效果不佳),以解释我在这里要完成的工作:-
我不知道如何从这里开始,我希望你们能给我一些指导。
谢谢。
最佳答案
我只解释逻辑,因为我没有时间自己写代码。简短的回答是,您应该遍历 map 图像的每个像素,如果周围区域(即一定距离之外)中的任何像素被认为是“陆地”,那么您将当前像素注册为一部分填充区域。
对于长答案,这里有 9 个步骤来实现您的目标。
1.决定填充的大小。比方说 6 个像素。
2。创建单色 map 图像(黑色是“水”,白色是“土地”)。在边缘周围留出至少 6 像素的边距。这是输入图像:(未按比例缩放)
3。创建一个直径为 11 像素 (11 = 6*2-1) 的圆图像。同样,黑色是空的/透明的,白色是实心的。这是命中区域图像:
4.创建第三张全黑的图片(开始)。使其与输入图像大小相同。它将用作输出图像。
5.迭代输入图像的每个像素。
6.在该像素处覆盖命中区域图像(仅通过计算虚拟地执行此操作),以便命中区域的中心(白色圆圈)位于当前输入图像像素上方。
7.现在迭代命中区域图像的每个像素。
8.如果命中区域图像的任何白色像素与输入图像的白色像素相交,则在输出图像中绘制一个白色像素(圆心所在的位置)。
9.转到第 5 步。
不可否认,从第 6 步开始,它并不是那么简单,但它应该相当容易实现。希望你明白其中的逻辑。如果我的解释太困惑(抱歉),那么我可以花一些时间编写完整的解决方案(使用 Javascript、C# 或 Haskell)。
关于java - Graphics2D:如何在不规则形状周围创建一致的填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15386645/