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

标签 java awt zooming graphics2d

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

enter image description here

在向我的项目利益相关者演示后,他们想要的是这个叠加层沿着 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);

我用绿色填充外部部分的原因是让我看看曲奇刀是否正确实现。这是结果:-

enter image description here

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

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

enter image description here

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

谢谢。

最佳答案

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

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

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

2。创建单色 map 图像(黑色是“水”,白色是“土地”)。在边缘周围留出至少 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)。

关于java - Graphics2D:如何在不规则形状周围创建一致的填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15386645/

相关文章:

java - Gson:使用不同的gson跳过不同的字段

java - 如何在 Java 中获取 BufferedImage 透明部分的形状?

javascript - 如何在 HTML 中逐渐放大?

wpf - WPF图像缩放

javac 和 java 的编码和区域设置错误

java - 在 ConstraintValidator 中注入(inject) EntityManager

java - 通过 Cursor.getSystemCustomCursor 可以使用哪些游标?

java - setVisible 和 requestFocus on textField

html - 如何防止桌面浏览器(Chrome、Safari)缩放网页

java - AlarmManager:如何安排每日闹钟和处理时间变化