2014-12-12 3 views
-3

Я новичок в графике в java, это моя первая программа рисования. Я мог бы рисовать линии, прямоугольники, овалы, используя прослушиватель мыши и прослушиватель движения мыши, как программа рисования, но у меня проблема с рисованием треугольников, которые я пытался использовать многоугольники, но это очень сложная .И действительно нужна помощь, чтобы понять, как решить эту проблему .any помощь будет appreciated.that мой код, это глупо, потому что я попробовать новую вещь, каждый второйРисование треугольника с помощью мыши

/* 
 * To change this license header, choose License Headers in Project Properties. 
 * To change this template file, choose Tools | Templates 
 * and open the template in the editor.  
 */ 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
/* * 
* 
* @author D S 
*/
public class GUI extends JPanel { 
    int[] x; 
    int[] y; 
    Graphics2D graph; 

    public GUI() { 
     Handler handler = new Handler(); 
     this.addMouseListener(handler); 
     this.addMouseMotionListener(handler); 
    } 

    public class Handler implements MouseListener, MouseMotionListener {@Override 
     public void mouseClicked(MouseEvent me) { 
      throw new UnsupportedOperationException("Not supported yet."); 
      // 
      To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      x[0] = e.getX(); 
      y[0] = e.getY(); 
      repaint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      x[1] = e.getX(); 
      x[2] = e.getX(); 
      y[1] = e.getY(); 
      y[2] = e.getY(); 
      graph.drawPolygon(x, y, x.length); 
      repaint(); 
     } 

     @Override 
     public void mouseEntered(MouseEvent me) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void mouseExited(MouseEvent me) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      x[1] = e.getX(); 
      x[2] = e.getX(); 
      y[1] = e.getY(); 
      y[2] = e.getY(); 
      repaint(); 
     } 

     @Override 
     public void mouseMoved(MouseEvent me) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 
    } 

    @Override 

    public void paint(Graphics g) { 
     graph.setStroke(new BasicStroke(2)); 
     graph.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g.setColor(Color.BLUE); 
     g.drawPolygon(x, y, x.length); 
    } 
} 
+2

Wooowww .... как бит какой-то идентификатор. –

+0

Я бы предложил использовать что-то вроде «Path2D», а затем «AffineTransform» для масштабирования и поворота, но это может быть немного более продвинутым, чем вы ищете ... – MadProgrammer

+2

Также, как удалить большинство этих пустых строк? ! –

ответ

0

Ну, так как вы на самом деле пытались что-то сделать и не смогли, я написал краткую, но полностью исполняемую программу, которая рисует riangle to the screen:

public class Test { 

    public static void main(String[] args) { 
     int width = 500; 
     int height = 500; 
     int[] x = { (width/2) - 50, (width/2), (width/2) + 50 }; 
     int[] y = { (height/2) + 50, (height/2) - 50, (height/2) + 50 }; 
     Polygon p = new Polygon(x, y, 3); 

     JFrame f = new JFrame("Thats what a triangle looks like"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel() { 
      public void paintComponent(Graphics g) { 
       g.fillPolygon(p); 
      } 

     }; 
     panel.setPreferredSize(new Dimension(width, height)); 

     f.getContentPane().add(panel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 

Ничего особенного, но я надеюсь, что это поможет вам на вашем пути. Удачи!

+0

Спасибо. Я постараюсь это понять. –

+0

Могу ли я задать вам вопрос. Мне удалось получить нужные мне точки в прямоугольниках, используя то, как я написал в коде, конечно, это не массив. I действительно знаю, что мой код - это глупый код, но как я могу получить свои очки в полигоне с помощью мыши –

+0

@ OmarKamal Вам действительно нужно всего 1 очко, чтобы нарисовать Rect, это происхождение. Другие 2 аргумента - это ширина и высота. –

1

Не имеет значения, какой метод вы используете, вам нужно знать, где должны быть точки, и использовать полигон или просто рисовать линии. Магии нет, это просто математика.

Есть много способов, вы можете создать прямоугольник и все помните, у вас есть только 2 точки отсчета:

  • (x0, y0) - что происхождение (мыши нажимаются событие)
  • (x1, y1) - текущее положение мыши

НЕРАСПРОСТРАНЕНИЯ перетаскиваемого метод

Вместо того, чтобы позволить перетаскивание пользователя нажмите 3 раза. Там у вас есть 3 пункта, которые точно соответствуют пользователю.

Простой метод прямоугольник

Представьте, что вы нарисуйте прямоугольник, базовую линию прямоугольника, где мышь будет основание треугольника. Этими точками являются [(x0,y1), (x1,y1)] (это горизонтальный сегмент от положения мыши до вертикальной воображаемой линии, проходящей через начало координат).

Теперь пропущенная точка находится на другой горизонтальной стороне воображаемого прямоугольника, нарисованного от мыши до начала координат. Именно в середине, что бы ((x1+x0)/2,y2)

Это ваши 3 очка

Метод окружности

Только представьте, вы рисуете окружность с центром в начале координат и нарисуйте треугольник (равностороннего) в. Это немного сложнее, но одна точка может быть всегда там, где ваша мышь (x1, y1) и другие 2 ... более усложняются.

Дайте ему попробовать. Просто запомните y=sin(angleInRadians)*radius и x=cos(angleInRadians)*radius. Сначала вам нужно найти угол вашей текущей точки (ту же формулу, но у вас уже есть точки, arcos/arcsin - обратные значения cos/Sin соответственно). С этого момента вы должны добавить/вычесть 180 ° (pi), чтобы найти других.

Немного хедз-ап, на всякий случай radians=degree*pi/180 или просто используйте Math.toRadians(degrees), как указал Дима Малигин.

+0

@OmarKamal Маленькая заметка о методе «окружности» «угол» должна быть в радианах не градусов (если вы не знали). Вы можете использовать 'Math.toRadians (degrees)' для преобразования или использования PI и вычисления их самостоятельно. –

+0

@ DimaMaligin Спасибо, я улучшил объяснение, надеясь, что теперь стало более ясно. – estani

Смежные вопросы