如何绘制 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);
我正在用鼠标光标制作游戏,我想通过用绿色版本的图像覆盖光标来表示健康,但只有它的一个几何扇区对应于健康百分比。这些帖子的解决方案: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);