2016-07-05 55 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

謝謝。剛剛運行它,它按照你所說的那樣工作。圖形有點新,所以我將分析您提供的內容以便更好地理解。 –