【问题标题】:Is it possible to create an outline around a PolyLine是否可以围绕折线创建轮廓
【发布时间】:2016-11-07 17:21:49
【问题描述】:

这个例子画了一个简单的折线。

是否可以在这条折线周围用红色画出轮廓。 不是一个单一的大红色正方形,而是一个将原始折线的轮廓与所有区域相距 3-5 点。

尝试了一些计算并针对固定值工作,但当折线值是随机的时,该算法并不总是有效,因为线的下一部分可能会向右而不是向左或向上而不是向下。

您几乎必须向前看 2-3 点才能知道您是否要进行加法或减法。

有没有更简单的方法?

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PolyLine extends JPanel 
{

  public void paint(Graphics g) {


        int[] xs = {25,  125, 85,  75, 25, 65, };
        int[] ys = {50,  50, 100,  110, 150, 100};

        BasicStroke traceStroke = new BasicStroke (1);
        Graphics2D gc = (Graphics2D) g.create();
        gc.setStroke(traceStroke);
        gc.setColor(Color.BLUE);
        gc.drawPolyline(xs, ys, 6);
      }

      public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new PolyLine());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(20,20, 1500,1500);
        frame.setVisible(true);
        }

}

【问题讨论】:

  • 选项1:找到折线的几何中心并从那里移动所有点。这对于不规则或凹线不是很好。选项 2:将每条线段从其当前位置移开,使用线段相交公式确定需要延长/缩短多少。对于随机情况,您可能需要查看线的缠绕以确定移动线段的方式。
  • 另外,显示尝试的“一些计算”。我在这里什么都没看到。

标签: java graphics2d polyline


【解决方案1】:

首先,请注意:通常最好将几何图元作为ShapedrawPolyline 函数(使用这些奇数整数数组坐标)有些过时了。将折线创建为Path2D 更加灵活。

对于您描述的任务,还需要将折线坐标转换为Path2D(如果您切换到Path2D,则可以省略此转换步骤)。

当您将多段线设为Shape 时,任务相当简单:您可以使用具有所需厚度和帽/连接特征的BasicStroke 创建此形状的描边版本,方法是调用BasicStroke#createStrokedShape .这种形状基本上是“粗线”的形状。为了避免连接处的伪影,您可以从这个Shape 创建一个Area,然后绘制这个区域。

所以最后画出实际的轮廓用2行代码就完成了,结果如下:

但这里是 MCVE,为了完整起见:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Area;
import java.awt.geom.Path2D;

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

public class ShapeOutlineTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> createAndShowGUI());
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.getContentPane().add(new ShapeOutlineTestPanel());
        f.setSize(500, 500);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

class ShapeOutlineTestPanel extends JPanel
{
    @Override
    protected void paintComponent(Graphics gr)
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D) gr;

        int[] xs = { 25, 125, 85, 75, 25, 65, };
        int[] ys = { 50, 50, 100, 110, 150, 100 };

        BasicStroke traceStroke = new BasicStroke(1);
        g.setStroke(traceStroke);
        g.setColor(Color.BLUE);
        g.drawPolyline(xs, ys, 6);

        Path2D path = new Path2D.Double();
        for (int i = 0; i < xs.length; i++)
        {
            if (i == 0)
            {
                path.moveTo(xs[i], ys[i]);
            }
            else
            {
                path.lineTo(xs[i], ys[i]);
            }
        }
        g.setColor(Color.RED);
        BasicStroke stroke = new BasicStroke(
            10.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        g.draw(new Area(stroke.createStrokedShape(path)));

    }
}

【讨论】:

  • 谢谢。刚刚运行它,它就像你说的那样工作。图形有点新,所以我将分析您提供的内容以便更好地理解。
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多