使用鼠标绘制三角形

时间:2014-12-12 21:16:44

标签: java swing

我是java的图形新手,这是我的第一个绘图程序我可以使用鼠标监听器和鼠标运动监听器(如绘画程序)的所有线条,矩形,椭圆形但是我有绘制三角形的问题我尝试使用多边形但是它是非常复杂。我真的需要帮助,以了解如何解决这个问题。任何帮助将不胜感激。这是我的代码它是愚蠢的,因为我每秒尝试一个新的东西

/*
 * 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 个答案:

答案 0 :(得分:1)

使用哪种方法无关紧要,您需要知道点的位置,并使用多边形或只绘制线条。没有魔法,只是数学。

您可以通过多种方式创建矩形,并且记住您只有2个参考点:

  • (x0,y0) - 这是原点(鼠标按下事件)
  • (x1,y1) - 当前鼠标位置

不可拖动的方法

而不是拖动让用户点击3次。你有3分,这正是用户想要的地方。

简单矩形方法

想象一下,您绘制一个矩形,鼠标所在矩形的基线将是三角形的基础。这些点是[(x0,y1), (x1,y1)](这是从鼠标位置到穿过原点的垂直虚线的水平线段。)

现在,缺失点位于从鼠标到原点绘制的虚拟矩形的另一个水平面上。恰好在它的中间,那将是((x1+x0)/2,y2)

这是你的3分

周长方法

想象一下,你在原点绘制一个圆心,并绘制一个三角形(等边)。这有点棘手,但有一点可能总是你的鼠标(x1,y1)和另外两个......更复杂。

试一试。请记住y=sin(angleInRadians)*radiusx=cos(angleInRadians)*radius。 你必须先找到当前点的角度(相同的公式,但你已经有了点,arcos / arcsin分别是cos / Sin的反转)。从那时起,您必须添加/减去180°(pi)才能找到其他的。

只是有点抬头,以防万一radians=degree*pi/180或只是使用Math.toRadians(degrees),正如Dima Maligin指出的那样。

答案 1 :(得分:0)

好吧,因为你真的试图做某事而失败了,我写了一个快速但完全可运行的程序,它在屏幕上绘制了一个三角形:

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);
    }
}

没什么特别的,但我希望它会帮助你。祝你好运!