内部剪辑与Java图形

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部剪辑与Java图形相关的知识,希望对你有一定的参考价值。

我需要使用java.awt.Graphics绘制一条线,但只应渲染位于矩形外部的线条部分。

是否可以使用图形剪辑支持或者我是否需要自己计算交叉点并剪切线?

答案

你需要使用Area类。此示例将演示如何执行您所要求的操作:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test extends JPanel {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        Test t = new Test();
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(t,BorderLayout.CENTER);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public Test() {
        setPreferredSize(new Dimension(300, 300));
    }

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g.create();
        Rectangle2D rectangleNotToDrawIn = new Rectangle2D.Double(100, 100, 20, 30);
        Area outside = calculateRectOutside(rectangleNotToDrawIn);
        g2.setPaint(Color.white);
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.setPaint(Color.black);
        g2.setClip(outside);
        g2.drawLine(0, 0, getWidth(), getHeight());

    }


    private Area calculateRectOutside(Rectangle2D r) {
        Area outside = new Area(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
        outside.subtract(new Area(r));
        return outside;
    }

}
另一答案

您可以使用AWT剪辑执行此操作。您需要知道要排除的矩形的边界以及绘图区域的外边界。

以下演示代码打开一个框架并在其中显示一个面板。面板的绘制方法设置一个示例剪辑,它看起来像一个矩形,中间有一个矩形孔,实际上它是一个描述我们想要排除的区域周围区域的多边形。剪辑矩形应该由排除的矩形的边界和绘图区域的外边缘组成,但是我保留了硬编码值以保持简单并更好地说明工作(我希望!)

+-------------------+
| clip drawing area |
+---+-----------+   |
|   | excluded  |   |
|   |   area    |   |
|   +-----------+   |
|                   |
+-------------------+

此方法具有手动计算线交叉的优点,因为它可以防止所有AWT绘制进入排除区域。我不知道这对你有用。

然后我的演示在整个区域上绘制一个黑色矩形,并在其中绘制一条白色对角线,以说明剪辑是否正常工作。

public class StackOverflow extends JFrame {
    public static void main(String[] args) {
        new StackOverflow();
    }

    private StackOverflow() {
        setTitle( "Clip with a hole" );
        setSize( 320,300 );
        getContentPane().add( new ClipPanel() );
        setVisible( true );
    }
}

class ClipPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Polygon clip = new Polygon(
                new int[]{ 0, 100, 100,  0,  0, 20, 20, 80, 80,  0 },
                new int[]{ 0,   0,  60, 60, 20, 20, 40, 40, 20, 20 },
                10
            );
        g.setClip(clip);
        g.setColor( Color.BLACK );
        g.fillRect( 0,0,100,60 );
        g.setColor( Color.WHITE );
        g.drawLine( 0,0,100,60 );
    }
}

以上是关于内部剪辑与Java图形的主要内容,如果未能解决你的问题,请参考以下文章

css - 容器与内部剪辑元素不匹配

如何实现自己的图形剪辑?

在 Three.Js 中剪裁一个体积,给出黑色区域而不是内部材质

解密体育背后AI黑科技:花样滑冰动作识别多模视频分类和精彩片段剪辑

快速剪辑-助力度咔智能剪辑提效实践

如何准确延长微小视频片段的持续时间?