Java Вычитаем линии

1

Таким образом, у меня есть простой прямоугольник, нарисованный на экране с вертикальными линиями, которые стекают по бокам. Так выглядит примерно так:
Изображение 174551

Эта линия на самом деле 1 полная линия работает от верхней части экрана до конца, она просто выглядит отвратительно. Но то, что я хочу сделать, состоит в том, чтобы разделить 1 строку на две строки, где она пересекает прямоугольник. Таким образом, это будет выглядеть так:
Изображение 174551

То, о чем я думал, имело линию, идущую по левой стороне прямоугольника (от вершины вверху слева до нижней левой вершины), а затем вычитала эту строку из полной строки, чтобы получить 2 результирующие строки.

Но у Java нет функции вычитания строк, поэтому я немного потерян... плюс я думаю, что есть лучший способ. Есть идеи?

  • 2
    Немного сложнее, но взгляните на Area котором есть add, subtrct и другие функции ...
  • 0
    @MadProgrammer Хитрость здесь в том, чтобы использовать очень тонкий Rectangle2D вместо Line2D .
Показать ещё 1 комментарий
Теги:
user-interface
graphics
swing
java-2d

2 ответа

3
Лучший ответ

Для этого я бы использовал Java-2D.

Изображение 174551

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);
    }
}
2

Если это только прямоугольник, вы можете использовать методы minY и maxY класса прямоугольника (фактически унаследованные от класса RectangularShape)

 // line 1 (your orange one)
 double x1 = rectangle.getMinX();
 double y1 = 0;
 double x2 = rectangle.getMinX();
 double y2 = rectangle.getMinY();

 // line 2 (your blue one)
 double x1 = rectangle.getMinX();
 double y1 = rectangle.getMaxY();
 double x2 = rectangle.getMinX();
 double y2 = conainer.getHeight(); // height of the container your painting your rectangle in I assume?

Если вы работаете с более продвинутыми формами, вы должны изучить класс Area упомянутый @MadProgrammer

Ещё вопросы

Сообщество Overcoder
Наверх
Меню