2017-03-02 3 views
0

パネルをセクターに分割するような複数の線を描く方法を知りたいと思います。以下はパネルJavaのセクタを分割するような複数行の線を描くにはどうすればよいですか?

This is the example of lines that I wanted to draw

のコードは、これまでのところ、私はそれを考え出したされているが、それは唯一の「X」の行とパネル上の1本の水平ラインを描くことができます。私は上記のイメージのような線をどのように描くことが可能か知りたい。

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    Graphics2D graphic = (Graphics2D)g; 
    Insets insets = getInsets(); 
    graphic.setStroke(new BasicStroke(5.0f)); 
    graphic.draw(new Line2D.Double(insets.left, insets.top,getWidth()-insets.right, getHeight()-insets.bottom)); 
    graphic.draw(new Line2D.Double(insets.left,getHeight()-insets.bottom,getWidth()-insets.right,insets.top)); 
    graphic.drawLine(0,200,800,200); 


} 

ありがとうございます。

+0

私の最初の考えは基本的に与えられた角度に基づいて、円の周りのポイントを計算し、それらの間に線を描く、あるペイント前paintComponent方法に

RenderingHints hints = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHints(hints); 

を追加することを検討してdはプロセスの基本的な制御をより良くすることができます。概念的には、[これはたとえば]のようなものです(http://stackoverflow.com/questions/30228146/drawing-a-line-maximum-point/30228270#30228270) – MadProgrammer

答えて

1

これを行うにはいくつかの方法がありますが、これは車輪のスポークのように見えます。点を円で計算する方法を知っているので、これを忘れてしまいます。

私たちは何を知っていますか:

  • を私たちは、エリア(パネルの大きさ)
  • に我々は円
上のポイントを計算する方法
  • をしたいセグメント/分割数を知っています

    その基本情報では、中心点を中心に均等に分割数を描くのに必要な角度デルタを工夫することができます

    その後、今

    Overshoot

    import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.EventQueue; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.geom.Line2D; 
    import java.awt.geom.Point2D; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.UIManager; 
    import javax.swing.UnsupportedLookAndFeelException; 
    
    public class Test { 
    
        public static void main(String[] args) { 
         new Test(); 
        } 
    
        public Test() { 
         EventQueue.invokeLater(new Runnable() { 
          @Override 
          public void run() { 
           try { 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
           } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
            ex.printStackTrace(); 
           } 
    
           JFrame frame = new JFrame("Testing"); 
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
           frame.add(new TestPane()); 
           frame.pack(); 
           frame.setLocationRelativeTo(null); 
           frame.setVisible(true); 
          } 
         }); 
        } 
    
        public class TestPane extends JPanel { 
    
         public TestPane() { 
         } 
    
         @Override 
         public Dimension getPreferredSize() { 
          return new Dimension(200, 200); 
         } 
    
         protected Point2D pointAt(double radians, double radius) { 
          double x = radius * Math.cos(radians); 
          double y = radius * Math.sin(radians); 
    
          return new Point2D.Double(x, y); 
         } 
    
         protected Point2D translate(Point2D point, Point2D to) { 
          Point2D newPoint = new Point2D.Double(point.getX(), point.getY()); 
          newPoint.setLocation(point.getX() + to.getX(), point.getY() + to.getY()); 
          return newPoint; 
         } 
    
         @Override 
         protected void paintComponent(Graphics g) { 
          super.paintComponent(g); 
          Graphics2D g2d = (Graphics2D) g.create(); 
          g2d.setColor(Color.BLACK); 
    
          double startAngle = 0; 
          double divisions = 12; 
          double delta = 360.0/divisions; 
    
          int centerX = getWidth()/2; 
          int centerY = getHeight()/2; 
          int radius = Math.min(centerX, centerY) * 2; // Overshoot the visible bounds 
    
          Point2D centerPoint = new Point2D.Double(centerX, centerY); 
          double angle = startAngle; 
          for (int index = 0; index < divisions; index++) { 
           Point2D point = pointAt(Math.toRadians(angle), radius); 
           point = translate(point, centerPoint); 
           g2d.draw(new Line2D.Double(centerPoint, point)); 
           angle += delta; 
          } 
    
          g2d.dispose(); 
         } 
    
        } 
    
    } 
    

    、あなたがライン "オーバーシュート" を持ってしたくない場合は、あなたの場合は、

    int radius = Math.min(centerX, centerY); 
    

    Undershoot

    int radius = Math.min(centerX, centerY) * 2; // Overshoot the visible bounds 
    

    を変更それは少し "より良い"を見てほしい、あなたcoul愚かに聞こえるかもしれないが、私 - あなたは何

  • 関連する問題