2016-07-05 56 views
0

本示例绘制了一个简单的PolyLine。是否有可能在PolyLine周围创建轮廓

是否有可能以红色勾勒出此多边形的轮廓。 不是一个大的红色正方形,而是一个将所有区域的原始PolyLine概述为3-5分的概念。

一些计算尝试并为固定值工作,但是当PolyLine值是随机的时,该算法并不总是工作,因为该行的下一部分可以向右而不是向左或向上而不是向下。

你几乎必须提前看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); 
     } 

} 
+0

选项1:找到折线的几何中心并从那里移动所有点。这对于不规则或凹线不太好。选项2:使用线段相交公式确定需要延长/缩短的距离,将每个线段从当前位置移开。您可能需要查看线路的绕线,以确定以哪种方式将线段移动到随机的情况。 –

+0

另外,显示尝试的“一些计算”。我在这里没有看到任何东西。 –

回答

1

首先,一句话:它通常最好有几何图元作为ShapedrawPolyline函数(使用这些奇数整数数组坐标)已经过时了。将折线创建为Path2D要灵活得多。

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

当你有折线为Shape,任务是相当简单:你可以创建这个形状的抚摸版本,使用BasicStroke具有所需厚度和帽/加入的特性,通过调用BasicStroke#createStrokedShape。这种形状基本上是“粗线”的形状。为了避免连接处的伪像,您可以从此Shape创建一个Area,然后绘制该区域。

到底

所以,画的实际轮廓与两行代码完成,结果如下:

Outline01.png

但这里的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))); 

    } 
} 
+0

谢谢。刚刚运行它,它按照你所说的那样工作。图形有点新,所以我将分析您提供的内容以便更好地理解。 –