Java减法行

Java减法行,java,swing,user-interface,graphics,java-2d,Java,Swing,User Interface,Graphics,Java 2d,所以我在屏幕上画了一个简单的矩形,它的两边有垂直的线条。所以它看起来像这样: 这一行实际上是一整行,从屏幕的顶部一直到底部,看起来有点像被切断了。但是我想做的是把这一条线分成两条线,在这两条线与矩形相交的地方。所以它看起来是这样的: 我所想的是在矩形的左边画一条线(从左上角顶点到左下角顶点),然后从整条线中减去这条线,得到两条合成线 但是Java没有行减法函数,所以我有点迷路了……而且我认为还有更好的方法。有什么想法吗?如果这只是一个矩形,您可以使用矩形类的minY和maxY方法(实际上是从

所以我在屏幕上画了一个简单的矩形,它的两边有垂直的线条。所以它看起来像这样:

这一行实际上是一整行,从屏幕的顶部一直到底部,看起来有点像被切断了。但是我想做的是把这一条线分成两条线,在这两条线与矩形相交的地方。所以它看起来是这样的:

我所想的是在矩形的左边画一条线(从左上角顶点到左下角顶点),然后从整条线中减去这条线,得到两条合成线


但是Java没有行减法函数,所以我有点迷路了……而且我认为还有更好的方法。有什么想法吗?

如果这只是一个矩形,您可以使用矩形类的
minY
maxY
方法(实际上是从
RectangularShape
类继承的)


如果您使用的是更高级的形状,那么您应该查看@MadProgrammer提到的
区域
类如果这只是一个矩形,您可以使用矩形类的
minY
maxY
方法(实际上继承自
RectangularShape
类)


如果您使用的是更高级的形状,那么您应该查看@MadProgrammer提到的
区域
类我会使用Java-2D来实现这一点

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

class RectangleSubtractedFromLines {

    public static BufferedImage getImage() {
        BufferedImage bi = new BufferedImage(600,200,BufferedImage.TYPE_INT_ARGB);

        Graphics2D g = bi.createGraphics();

        Rectangle2D rect = new Rectangle2D.Double(50,50,100,100);
        // we never draw this, it is used as an area slightly bigger than 
        // the actual rectangle, to subract from the lines to give them space.
        int pad = 8;
        Rectangle2D rectBuffer = new Rectangle2D.Double(
                50-pad,50-pad,100+(2*pad),100+(2*pad));

        // we cannot form an Area from a Line2D, however 
        // we CAN form an Area from a (very thin) Rectangle2D
        Rectangle2D line1 = new Rectangle2D.Double(0,50,600,.02d);
        Rectangle2D line2 = new Rectangle2D.Double(0,149.98,600,.02d);

        Area lines = new Area(line1);
        lines.add(new Area(line2));
        lines.subtract(new Area(rectBuffer));

        g.setColor(Color.RED);
        g.setStroke(new BasicStroke(
                3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g.draw(rect);

        g.setColor(Color.MAGENTA.darker().darker());
        g.setStroke(new BasicStroke(
                6, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g.draw(lines);

        g.dispose();

        return bi;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JLabel gui = new JLabel(new ImageIcon(
                        RectangleSubtractedFromLines.getImage()));

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}


我会使用Java-2D来实现这一点

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

class RectangleSubtractedFromLines {

    public static BufferedImage getImage() {
        BufferedImage bi = new BufferedImage(600,200,BufferedImage.TYPE_INT_ARGB);

        Graphics2D g = bi.createGraphics();

        Rectangle2D rect = new Rectangle2D.Double(50,50,100,100);
        // we never draw this, it is used as an area slightly bigger than 
        // the actual rectangle, to subract from the lines to give them space.
        int pad = 8;
        Rectangle2D rectBuffer = new Rectangle2D.Double(
                50-pad,50-pad,100+(2*pad),100+(2*pad));

        // we cannot form an Area from a Line2D, however 
        // we CAN form an Area from a (very thin) Rectangle2D
        Rectangle2D line1 = new Rectangle2D.Double(0,50,600,.02d);
        Rectangle2D line2 = new Rectangle2D.Double(0,149.98,600,.02d);

        Area lines = new Area(line1);
        lines.add(new Area(line2));
        lines.subtract(new Area(rectBuffer));

        g.setColor(Color.RED);
        g.setStroke(new BasicStroke(
                3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g.draw(rect);

        g.setColor(Color.MAGENTA.darker().darker());
        g.setStroke(new BasicStroke(
                6, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g.draw(lines);

        g.dispose();

        return bi;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JLabel gui = new JLabel(new ImageIcon(
                        RectangleSubtractedFromLines.getImage()));

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}


稍微复杂一点,但看看它有add和subtrct以及其他功能…@MadProgrammer这里的诀窍是使用一个非常薄的
矩形2D
,而不是
Line2D
。@AnderThompson我想我还是会先计算两条独立的线…稍微复杂一点,但是看看它有add和subtrct以及其他功能…@MadProgrammer这里的诀窍是使用一个非常薄的
矩形2D
,而不是
线条2D
@andrewhompson,我想我还是先计算两条独立的线条吧。。。