<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 剪裁 > 原文: [https://zetcode.com/gfx/java2d/clipping/](https://zetcode.com/gfx/java2d/clipping/) 在 Java 2D 教程的這一部分中,我們將討論裁剪。 ## 剪裁 剪裁將圖形限制在某個區域。 這樣做是出于效率原因并產生各種效果。 使用剪裁時,我們必須使用`Graphics`對象的副本,或者恢復原始的剪裁屬性。 更改剪裁不會影響現有像素; 它僅影響將來的渲染。 在以下示例中,我們將圖像裁剪為圓形。 `ClippingEx.java` ```java package com.zetcode; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Ellipse2D; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; class Surface extends JPanel implements ActionListener { private int pos_x = 8; private int pos_y = 8; private final int RADIUS = 90; private final int DELAY = 35; private Timer timer; private Image image; private final double delta[] = { 3, 3 }; public Surface() { loadImage(); determineAndSetImageSize(); initTimer(); } private void loadImage() { image = new ImageIcon("mushrooms.jpg").getImage(); } private void determineAndSetImageSize() { int h = image.getHeight(this); int w = image.getWidth(this); setPreferredSize(new Dimension(w, h)); } private void initTimer() { timer = new Timer(DELAY, this); timer.start(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.clip(new Ellipse2D.Double(pos_x, pos_y, RADIUS, RADIUS)); g2d.drawImage(image, 0, 0, null); g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } @Override public void actionPerformed(ActionEvent e) { moveCircle(); repaint(); } private void moveCircle() { int w = getWidth(); int h = getHeight(); if (pos_x < 0) { delta[0] = Math.random() % 4 + 5; } else if (pos_x > w - RADIUS) { delta[0] = -(Math.random() % 4 + 5); } if (pos_y < 0 ) { delta[1] = Math.random() % 4 + 5; } else if (pos_y > h - RADIUS) { delta[1] = -(Math.random() % 4 + 5); } pos_x += delta[0]; pos_y += delta[1]; } } public class ClippingEx extends JFrame { public ClippingEx() { initUI(); } private void initUI() { setTitle("Clipping"); add(new Surface()); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ClippingEx cl = new ClippingEx(); cl.setVisible(true); } }); } } ``` 屏幕上正在移動一個圓圈,并顯示了一部分基礎圖像。 這就像我們從孔中看一樣。 ```java Graphics2D g2d = (Graphics2D) g.create(); ``` 我們創建`Graphics2D`對象的副本。 因此,更改剪裁不會影響其他在`Graphics2D`對象被重用的 Swing 零件。 ```java g2d.clip(new Ellipse2D.Double(pos_x, pos_y, RADIUS, RADIUS)); ``` `clip()`方法將現有剪裁與作為參數給出的形狀結合在一起。 所得的相交設置為片段。 在我們的例子中,最終的剪裁是圓形。 ```java if (pos_x < 0) { delta[0] = Math.random() % 4 + 5; } else if (pos_x > w - RADIUS) { delta[0] = -(Math.random() % 4 + 5); } ``` 如果圓碰到窗口的左側或右側,則圓的移動方向會隨機變化。 頂部和底部也一樣。 ```java g2d.dispose(); ``` 完成繪畫后,我們必須釋放`Graphics2D`對象的副本。 ## 剪裁形狀 在下面的示例中,我們將剪切到兩個形狀的交點:矩形和圓形。 `ClippingShapesEx.java` ```java package com.zetcode; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; class Surface extends JPanel implements ActionListener { private Timer timer; private double rotate = 1; private int pos_x = 8; private int pos_y = 8; private final double delta[] = {1, 1}; private final int RADIUS = 60; public Surface() { initTimer(); } private void initTimer() { timer = new Timer(10, this); timer.start(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); Shape oldClip = g2d.getClip(); int w = getWidth(); int h = getHeight(); Rectangle rect = new Rectangle(0, 0, 200, 80); AffineTransform tx = new AffineTransform(); tx.rotate(Math.toRadians(rotate), w / 2, h / 2); tx.translate(w / 2 - 100, h / 2 - 40); Ellipse2D circle = new Ellipse2D.Double(pos_x, pos_y, RADIUS, RADIUS); GeneralPath path = new GeneralPath(); path.append(tx.createTransformedShape(rect), false); g2d.clip(circle); g2d.clip(path); g2d.setPaint(new Color(110, 110, 110)); g2d.fill(circle); g2d.setClip(oldClip); g2d.draw(circle); g2d.draw(path); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } public void step() { int w = getWidth(); int h = getHeight(); rotate += 1; if (pos_x < 0) { delta[0] = 1; } else if (pos_x > w - RADIUS) { delta[0] = -1; } if (pos_y < 0) { delta[1] = 1; } else if (pos_y > h - RADIUS) { delta[1] = -1; } pos_x += delta[0]; pos_y += delta[1]; } @Override public void actionPerformed(ActionEvent e) { step(); repaint(); } } public class ClippingShapesEx extends JFrame { public ClippingShapesEx() { initUI(); } private void initUI() { setTitle("Clipping shapes"); add(new Surface()); setSize(350, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ClippingShapesEx ex = new ClippingShapesEx(); ex.setVisible(true); } }); } } ``` 在我們的示例中,我們有一個彈跳的圓和一個旋轉的矩形。 當這些形狀重疊時,結果區域將充滿顏色。 ```java Shape oldClip = g2d.getClip(); ``` 由于我們沒有創建`Graphics2D`對象的副本,因此我們將存儲舊剪裁以供以后使用。 最后,我們必須將剪裁重置為原始剪裁。 ```java Rectangle rect = new Rectangle(0, 0, 200, 80); AffineTransform tx = new AffineTransform(); tx.rotate(Math.toRadians(rotate), w / 2, h / 2); tx.translate(w / 2 - 100, h / 2 - 40); ``` 矩形正在旋轉。 它始終位于面板的中間。 ```java GeneralPath path = new GeneralPath(); path.append(tx.createTransformedShape(rect), false); ``` 在這里,我們得到了旋轉矩形的形狀。 ```java g2d.clip(circle); g2d.clip(path); g2d.setPaint(new Color(110, 110, 110)); g2d.fill(circle); ``` 在這里,我們將繪圖限制為兩個形狀的交點。 如果它們重疊,則結果形狀的內部將充滿顏色。 `clip()`方法將初始剪裁(組件的客戶區域)與給定的兩個形狀組合在一起。 ```java g2d.setClip(oldClip); ``` 使用`setClip()`方法,我們在繪制形狀之前將剪裁區域重置為舊剪裁。 與`clip()`方法不同,`setClip()`不合并剪切區域。 它將剪裁重置到新區域。 因此,此方法應專門用于還原舊剪裁。 ![Clipping shapes](https://img.kancloud.cn/e5/c9/e5c9b164123091ed5053c77d2aa7109e_350x300.jpg) 圖:剪裁形狀 在 Java 2D 教程的這一部分中,我們討論了剪裁。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看