栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java笔记-多边形绘制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java笔记-多边形绘制

多边形绘制

在界面上任意位置画点,将点连成多边形

实现思路
  • 实现MouseListener接口,触发点击事件画点
  • 定义一个类表示点的信息
  • 定义数组存储所有已绘制的点
  • 遍历所有的点,并记录x和y的最大值和最小值
  • 根据x、y的最大值和最小值确定原点,建立坐标系
  • 计算每个点与原点的角度,根据角度排序
  • 按顺序连接点
完整代码

定义Point类

x、y为鼠标点击的位置,angle为与原点的角度,为了能直接使用sort方法,需要实现Comparable接口

public class Point implements Comparable{
    private int x;
    private int y;
    private double angle;

    public Point(){

    }

    public Point(int x,int y){
        this.x = x;
        this.y = y;
        this.angle = 0;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public double getAngle() {
        return angle;
    }

    public void setAngle(double angle) {
        this.angle = angle;
    }

    @Override
    public int compareTo(Object o) {
        Point p = (Point)o;
        if (angle 

实现MouseListener接口,并实现绘制方法

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class DrawListener implements MouseListener {

    public Graphics g;
    //定义数组存储绘制的点
    List points = new ArrayList<>();
    private int xMin,xMax,yMin,yMax;
    //原点的位置
    private int x,y;

    //构建坐标系,每次增加点时调用
    private void rebuild(MouseEvent e){
        xMin = e.getX() < xMin ? e.getX() : xMin;
        xMax = e.getX() > xMax ? e.getX() : xMax;
        yMin = e.getY() < yMin ? e.getY() : yMin;
        yMax = e.getY() > yMax ? e.getY() : yMax;
        //确定原点
        x = (xMin + xMax) / 2;
        y = (yMin + yMax) / 2;
    }

    //计算角度x1,y1为绘制的点
    public double getAngle(int x1,int y1){
        //计算到原点的距离
        double distance = Math.sqrt(Math.pow((x1-x),2)+Math.pow((y1-y),2));
        //计算余弦
        double cos = (x1-x) / distance;
        //计算角度
        double angle = Math.acos(cos);
        //根据象限修正角度,angle的范围在0-π
        if (y1 >= y){
            return angle;
        }else {
            return Math.PI*2-angle;
        }
    }

    //绘制多边形
    public void drawPolygon(){
        //使用白色清屏
        g.setColor(Color.WHITE);
        g.fillRect(0,0,800,800);
        g.setColor(Color.BLACK);
        //按顺序连接各个点
        for (int i = 0; i < points.size()-1; i++) {
            g.drawLine(points.get(i).getX(),points.get(i).getY(),points.get(i+1).getX(),points.get(i+1).getY());
        }
        //连接最后的点和第一个点
        g.drawLine(points.get(points.size()-1).getX(),points.get(points.size()-1).getY(),points.get(0).getX(),points.get(0).getY());
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        //向数组中添加点
        points.add(new Point(e.getX(),e.getY()));
        //在界面上绘制点
        g.drawLine(e.getX(),e.getY(),e.getX(),e.getY());
        if (points.size() == 1){
            //初始化
            xMin = points.get(0).getX();
            xMax = points.get(0).getX();
            yMin = points.get(0).getY();
            yMax = points.get(0).getY();
        }
        if (points.size() >= 2){
            //多边形
            //确定坐标系
            rebuild(e);

            //依次计算所有的点的角度
            for (int i = 0; i < points.size(); i++) {
                //计算角度,需要区分象限
                points.get(i).setAngle(getAngle(points.get(i).getX(),points.get(i).getY()));
            }
            //根据角度排序
            Collections.sort(points);
            //调用绘制方法
            drawPolygon();
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

编写界面和测试类

import javax.swing.*;

public class DrawTest {

    public void show(){
        Jframe jf = new Jframe("多边形绘制");
        jf.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
        jf.setSize(800,800);
        jf.setVisible(true);

        DrawListener drawListener = new DrawListener();
        drawListener.g = jf.getGraphics();

        jf.addMouseListener(drawListener);
    }

    public static void main(String[] args) {
        new DrawTest().show();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/592451.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号