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,我想我还是先计算两条独立的线条吧。。。