2016-03-07 3 views
1

Я написал код, чтобы нарисовать шестиугольник. Сначала я нарисую 6 точек, используя эту формулу: (x + r * cos (i * 2 * pi/6), y + r * sin (i * 2 * pi/6)) , затем после того, как я построил эти точки i пытался совместить точки, используя алгоритм Брешнама для рисования линий, которые я реализовал в методе. К сожалению, код не работает успешно, и я получаю его вместо шестиугольника. Я думаю, что есть ошибка с реализацией алгоритма Брешнама. Кроме того, я попытался построить каждую точку отдельно, но это не сработает. Если кто-нибудь может мне помочь?Рисование шестиугольника с использованием ошибки Java

enter image description here

Кроме того, это мой код:

package javaapplication1; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Toolkit; 
import java.awt.geom.Line2D; 
import static java.lang.Math.cos; 
import static java.lang.Math.sin; 

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


public class LinesDrawingExample extends JFrame { 

    public LinesDrawingExample() { 
     super("Lines Drawing Demo"); 

     //Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); 

     setSize(500, 500); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
    } 

    void drawLines(Graphics g , int x,int y) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.RED); 


     g2d.drawLine(x, y, x,y); 


     //g2d.draw(new Line2D.Double(59.2d, 99.8d, 419.1d, 99.8d)); 

     // g2d.draw(new Line2D.Float(21.50f, 132.50f, 459.50f, 132.50f)); 

    } 

    public void getvalue(Graphics g,double x1,double y1 ,double x2,double y2){ 









     int x=(int)x1; 
     int y=(int)y1; 
     int deltax=(int)x2-(int)x1; 
     int deltay=(int)y2-(int)y1; 
     int twodeltay=2*deltay; 
     int var1=twodeltay-(2*deltax); 
     int p=twodeltay-deltax; 
     drawLines(g,x,y); 


     while(x<x2) 
     { 
      drawLines(g,x,y); 

      if(p>0) 
      { 
      y=y+1; 
      p=p+twodeltay-(2*deltax); 

      } 
      else 
      { 
       p=p+twodeltay; 
      } 
      x++; 


} 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     double r=50; 
     double pi=3.14; 

     int [] xval =new int [6]; 
     int [] yval=new int [6]; 

     int x=100,y=100; 

     for(int i=0; i<6; i++) { 
    getvalue(g,x + r*cos(i*2*pi/6), y + r*sin(i*2*pi/6),x + r*cos(i*2*pi/6),y + r*cos(i*2*pi/6)); 
    xval[i]=(int)(x + r*cos(i*2*pi/6)); 
    yval[i]=(int)(y + r*sin(i*2*pi/6)); 
     } 


      getvalue(g,xval[4],yval[4],xval[5],yval[5]); 
      getvalue(g,xval[2],yval[2],xval[1],yval[1]); 


      getvalue(g,xval[3],yval[3],xval[2],yval[2]); 
       getvalue(g,xval[3],yval[3],xval[3],yval[3]); 
       getvalue(g,xval[4],yval[4],xval[4],yval[4]); 
       getvalue(g,xval[5],yval[5],xval[5],yval[5]); 









    } 




    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new LinesDrawingExample().setVisible(true); 
      } 
     }); 
    } 
} 
+0

Переопределить 'paintComponent (g)', а не 'paint (g)'. – user3437460

+0

@ user3437460 Я попытался переопределить paintComponent (g), но он не включен в методы, которые нужно переопределить. –

+0

Взгляните на мое решение ниже. – user3437460

ответ

2

Вы рисовали на JFrame. Никогда не нарисуйте JFrame. Всегда используйте JPanel.

Вот графический интерфейс.

Hexagon

Вот основные изменения, которые я сделал.

  1. Я переместил создание шестиугольника в свой класс, шестиугольник. Таким образом, вы можете создать список шестиугольников, если хотите.

  2. Я переместил создание панели рисования в свой класс DrawingPanel. Таким образом, у меня есть класс представления GUI, который рисует шестиугольник и класс модели GUI, который генерирует шестиугольники. Хорошее, чистое разделение проблем.

  3. Это оставило код JFrame и экземпляр объекта Hexagon в конструкторе класса LinesDrawingExample.

Вот код.

package com.ggl.testing; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Polygon; 

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

public class LinesDrawingExample extends JFrame { 

    private static final long serialVersionUID = 3775690273871048733L; 

    private DrawingPanel drawingPanel; 

    public LinesDrawingExample() { 
     super("Lines Drawing Demo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Hexagon hexagon = new Hexagon(new Point(250, 250), 200); 

     drawingPanel = new DrawingPanel(hexagon); 
     add(drawingPanel); 

     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new LinesDrawingExample(); 
      } 
     }); 
    } 

    public class DrawingPanel extends JPanel { 
     private static final long serialVersionUID = 5701311351092275287L; 

     private Hexagon hexagon; 

     public DrawingPanel(Hexagon hexagon) { 
      this.hexagon = hexagon; 
      this.setPreferredSize(new Dimension(500, 500)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      g.setColor(Color.RED); 
      g.drawPolygon(hexagon.getHexagon()); 
     } 
    } 

    public class Hexagon { 
     private final int radius; 

     private final Point center; 

     private final Polygon hexagon; 

     public Hexagon(Point center, int radius) { 
      this.center = center; 
      this.radius = radius; 
      this.hexagon = createHexagon(); 
     } 

     private Polygon createHexagon() { 
      Polygon polygon = new Polygon(); 

      for (int i = 0; i < 6; i++) { 
       int xval = (int) (center.x + radius 
         * Math.cos(i * 2 * Math.PI/6D)); 
       int yval = (int) (center.y + radius 
         * Math.sin(i * 2 * Math.PI/6D)); 
       polygon.addPoint(xval, yval); 
      } 

      return polygon; 
     } 

     public int getRadius() { 
      return radius; 
     } 

     public Point getCenter() { 
      return center; 
     } 

     public Polygon getHexagon() { 
      return hexagon; 
     } 

    } 
} 
3

Вы не должны отменять paint(g). Вместо этого переставьте paintComponent(g). Вы можете использовать цикл для определения всех точек, необходимых для многоугольника.

земля точки и создать объект Polygon, а затем нарисовать объект многоугольника:

enter image description here

public class DrawPolyPanel extends JPanel{ 
    public DrawPolyPanel(){ 
     setPreferredSize(new Dimension(200, 200)); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g);    
     Polygon p = new Polygon(); 
     for (int i = 0; i < 6; i++) 
      p.addPoint((int) (100 + 50 * Math.cos(i * 2 * Math.PI/6)), 
       (int) (100 + 50 * Math.sin(i * 2 * Math.PI/6)));   
     g.drawPolygon(p);  
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame("DrawPoly"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new DrawPolyPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
Смежные вопросы