在界面上任意位置画点,将点连成多边形
实现思路- 实现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();
}
}



