Graphics2D.clip(Shape)
穴のあるクリッピング領域を ( 経由で) どのように定義しますか?
例: Rectangle r1 から r1 内の別の Rectangle r2 を引いたもの
これには簡単な答えがあると確信していますが、私は空白を描いています。
Graphics2D.clip(Shape)
穴のあるクリッピング領域を ( 経由で) どのように定義しますか?
例: Rectangle r1 から r1 内の別の Rectangle r2 を引いたもの
これには簡単な答えがあると確信していますが、私は空白を描いています。
Path2D.append()
+ EVEN_ODD ワインディング ルールはトリックを行うように見えます:
package com.example.test.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class HoleClipper extends JPanel
{
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
Rectangle2D r1 = getBounds();
int margin = 50;
Rectangle2D r2 = new Rectangle2D.Double(
r1.getMinX()+margin,
r1.getMinY()+margin,
r1.getWidth()-2*margin,
r1.getHeight()-2*margin);
g2d.setColor(Color.YELLOW);
g2d.fill(r1);
Path2D p = new Path2D.Double(Path2D.WIND_EVEN_ODD);
p.append(r1, false);
p.append(r2, false);
g2d.clip(p);
int spacing = 10;
g2d.setColor(Color.BLACK);
for (double d = 0; d < r1.getWidth() + r1.getHeight(); d += spacing)
{
Line2D line = new Line2D.Double(0, d, d, 0);
g2d.draw(line);
}
}
public static void main(String[] args) {
HoleClipper clipper = new HoleClipper();
clipper.setPreferredSize(new Dimension(300, 200));
JFrame frame = new JFrame("HoleClipper");
frame.setContentPane(clipper);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
これは Graphics の setClip ではサポートされていないようです。ドキュメントを読むと、サポートされているのは長方形だけです。
public abstract void setClip(シェイプ クリップ)
現在のクリッピング領域を任意のクリップ形状に設定します。Shape インターフェイスを実装するすべてのオブジェクトを使用してクリップを設定できるわけではありません。サポートが保証されている唯一の Shape オブジェクトは、getClip メソッドおよび Rectangle オブジェクトを介して取得される Shape オブジェクトです。このメソッドは、ユーザー クリップを設定します。これは、デバイスの境界とウィンドウの可視性に関連するクリッピングとは無関係です。
このクラスは、穴のある形状を表現できるGeneralPath
の実装です。Shape
複数のパス セグメントを定義します。1 つは「外側」を表し、もう 1 つは「穴」を表します。を使用して必要なクリッピング領域を定義しGeneralPath
、 を呼び出しますclip()
。