如何绘制 BufferedImage 的扇区?

How to draw a sector of a BufferedImage?

我正在用鼠标光标制作游戏,我想通过用绿色版本的图像覆盖光标来表示健康,但只有它的一个几何扇区对应于健康百分比。这些帖子的解决方案:Drawing slices of a circle in java? & How to draw portions of circles based on percentages in Graphics2D? 几乎是我想要做的,但是使用 BufferedImage 而不是纯色填充。

    //Unfortunately all this does is cause nothing to draw, but commenting this out allows the overlay image to draw
    Arc2D.Double clip = new Arc2D.Double(Arc2D.PIE);
    double healthAngle = Math.toRadians((((Double)data.get("health")).doubleValue() * 360.0 / 100.0) - 270.0);
    clip.setAngles(0, -1, Math.cos(healthAngle), Math.sin(healthAngle));
    System.out.println(Math.cos(healthAngle) + " " + Math.sin(healthAngle));
    g.setClip(clip);

简而言之,如何在给定任意角度的情况下绘制 BufferedImage 的扇区?

如果您阅读 setClip(Shape) 的 API 文档,您会发现唯一可以保证有效的形状是矩形。所以,设置剪辑可能不会起作用。

但是,还有其他选择。最明显的可能是使用 TexturePaint 来用 BufferedImage 填充弧线。类似于:

TexturePaint healthTexture = new TexturePaint(healthImg, new Rectangle(x, y, w, h));
g.setPaint(healthTexture);
g.fill(arc); // "arc" is same as you used for "clip" above

另一种选择是先在透明背景上以纯色绘制圆弧,然后使用 SRC_IN Porter-Duff 模式在其上绘制图像。类似于:

g.setPaint(Color.WHITE);
g.fill(arc); // arc is same as your clip
g.setComposite(AlphaComposite.SrcIn); // (default is SrcOver)
g.drawImage(x, y, healthImg, null);