📄 graph.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
import java.math.*;
class Graph implements MouseMotionListener, MouseListener{
static ImagePanel panel; //定义画布
int x1, y1, x2, y2;
int[] X = new int[100];
int[] Y = new int[100];
Edge[] edges = new Edge[500]; //定义边的数组
int PointNum, EdgeNum; //定义点的序号,边的序号
static JLabel label; //显示点和线的信息
public Graph(){
JFrame f = new JFrame("MyImageMover");
panel = new ImagePanel();
label = new JLabel(" ");
panel.addMouseListener(this);
panel.addMouseMotionListener(this);
f.getContentPane().add(panel, BorderLayout.CENTER);
f.getContentPane().add(label, BorderLayout.SOUTH);
PointNum = EdgeNum = 0;
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); //设置窗口的关闭方式
f.pack();
f.setVisible(true);
}
public void myPaint(MouseEvent e){
panel.clicked = true;
panel.getGraphics().drawOval(e.getX(), e.getY(), 3, 3); //画小圈表示点
}
public double Distance(int a1, int b1, int a2, int b2){
return Math.sqrt( (a1-a2)*(a1-a2) + (b1-b2)*(b1-b2) ); //求两点之间的实际距离作为线段的权值
}
public void mousePressed(MouseEvent e) {
x1 = e.getX(); //鼠标按下获取起点的坐标
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) {
int p1=-1, p2=-1, i;
double dist;
Graphics g = panel.getGraphics();
x2 = e.getX(); //鼠标放下获取终点的坐标
y2 = e.getY();
g.setColor(Color.cyan);
dist = Distance(x1, y1, x2, y2); //求两点的距离
label.setText(""+dist);
if(dist > 5){
for(i=0; i<PointNum; i++){ //控制两个点不重合
if(Distance(X[i], Y[i], x1, y1) < 3) p1 = i; //如果距离小于3的话就是原来的点
else if(Distance(X[i], Y[i], x2, y2) < 3) p2 = i; //如果距离大于3的话就是新的点
}
label.setText("p1"+p1+" p2"+p2);
if((p1==-1) || (p2==-1)) return;
g.setColor(Color.green); //设置点的颜色
g.drawLine(X[p1], Y[p1], X[p2], Y[p2]); //1,2两点间画线
edges[EdgeNum++] = new Edge(p1, p2, dist); //创建边
}
else{
g.setColor(Color.blue); //如果距离不是小于5的话,鼠标放下时画了一个新的点
g.drawOval(x1-2, y1-2, 4, 4);
X[PointNum] = x1;
Y[PointNum] = y1;
PointNum++; //点集加1
}
}
public void mouseDragged(MouseEvent e) {} //重写接口的鼠标动作
public void mouseClicked(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
class ImagePanel extends JPanel{
Image img;
boolean clicked = false;
int x = 100, y = 100;
Dimension preferredSize = new Dimension(400,250); //设置大小
public ImagePanel(){ //画边框
img = Toolkit.getDefaultToolkit().getImage("T4.gif");
Border raisedBevel = BorderFactory.createRaisedBevelBorder();
Border lowedBevel = BorderFactory.createLoweredBevelBorder();
Border compond = BorderFactory.createCompoundBorder(raisedBevel,lowedBevel);
setBorder(compond);
}
public Dimension getPreferredSize(){
return preferredSize;
}
}
class Edge{ //定义边的结构
public int p0, p1;
public double distance;
public Edge(){}
public Edge(int i, int j, double d){
p0 = i;
p1 = j;
distance = d;
}
}
public void SaveData(){ //保存数据
int i;
if(LineLen == 0){
label.setText("Can't save before compute Convex Hull.");
return;
}
try{
DataOutputStream fileWriter = new DataOutputStream(new FileOutputStream("Data.swj"));//建立或打开文件
fileWriter.writeInt(PointNum); //写入点的数量
for (i = 0; i < PointNum; i++) { //写入各点坐标,先为横坐标,后为纵坐标
fileWriter.writeInt(X[i]);
fileWriter.writeInt(Y[i]);
}
fileWriter.writeInt(LineLen); //写入凸包点的点数
for(i = 0; i <= LineLen; i++) {
fileWriter.writeInt(LineList[i]); //写入各凸包点
}
}catch(Exception e){
label.setText("Error in writing file."); //显示出错信息
}
}
public void LoadData(){ //读取数据
Graphics g = panel.getGraphics(); //获取Graphis变量,以便画图
int i, p0, p1; //循环变量
try{
DataInputStream fileReader = new DataInputStream(new FileInputStream("Data.swj"));//打开数据文件
PointNum = fileReader.readInt(); //读取点的数量
for(i = 0; i < PointNum; i++){ //依次读入各点
X[i] = fileReader.readInt();
Y[i] = fileReader.readInt();
g.setColor(Color.blue); //画点
g.drawOval(X[i]-2, Y[i]-2, 4, 4);
}
LineLen = fileReader.readInt(); //读取凸包点数
p0 = fileReader.readInt(); //读第一个点
for(i = 0; i < LineLen; i++){ //依次读取下一个点,并连线
p1 = fileReader.readInt();
System.out.println(p1);
DrawLine(p0, p1);
p0 = p1;
}
public void ClrScr(){ //擦除屏幕
Graphics g = panel.getGraphics();
int i, p1, p2, p3, p4; //p1至p4分别为上下左右的边界点
if(PointNum == 0) return;
p1 = p2 = p3 = p4 = 0;
for(i = 0; i < PointNum; i++){
if(Y[i] < Y[p1]) p1 = i; //记录最上与最下的点
else if(Y[i] > Y[p2]) p2 = i;
if(X[i] < X[p3]) p3 = i; //记录最左与最右的点
else if(X[i] > X[p4]) p4 = i;
}
g.clearRect(X[p3]-2, Y[p1]-2, X[p4]-X[p3]+5, Y[p2]-Y[p1]+5); //清除区域
}
public static void main(String[] args){
new Graph();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -