合肥工业大学操作系统绘制前驱图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课 程 设 计
绘制描述事件先后顺序的前驱图
计算机科学与技术09-2
2010 年 6 月20日
设计题目 学 号
专业班级 学生姓名
指导教师
合肥工业大学课程设计任务书
第一章课程设计概述
1.1 设计任务:设计一个可以绘制前驱图的界面程序
1.2 设计要求:建立前驱图的数据结构描述;
建立绘制前驱图的例程,包括结点和有向边;
可以删除、添加结点或有向边;
可用鼠标在窗口的任意位置指点,确定结点或有向边位置;
可以拖动现有结点的位置,与该结点相连的有向边也随之移动;
可以将前驱图存入文件,从文件中取出;
第二章开发环境
Java jdk1.6,eclipse
第三章程序算法与实现
●绘制结点算法简述
先绘制一个圆,将数字转化为字符,再在圆中绘制字符
●绘制带剪头直线算法简述
先绘制一条直线,在直线的一端绘制一个三角形
第四章程序实现---数据结构
Vector
第五章程序实现---程序清单
Node.java
package com.draw;
import java.awt.Graphics2D;
public class Node {
/*绘制结点函数*/
public void drawNode(int x,int y, int n,Graphics2D g){
String str=Integer.toString(n);
g.drawOval(x, y, 20, 20);
g.drawString(str, x+7, y+15);
}
}
Line.java
package com.draw;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
public class Line {
/*绘制直线函数*/
public void drawLine(int sx, int sy, int ex, int ey,Graphics2D g){
double H = 10; // 箭头高度
double L = 4; // 底边的一半
int x3 = 0;
int y3 = 0;
int x4 = 0;
int y4 = 0;
double awrad = Math.atan(L / H); // 箭头角度
double arraow_len = Math.sqrt(L * L + H * H); // 箭头的长度
double[] arrXY_1 = rotateVec(ex - sx, ey - sy, awrad, true, arraow_len); double[] arrXY_2 = rotateVec(ex - sx, ey - sy, -awrad, true, arraow_len); double x_3 = ex - arrXY_1[0]; // (x3,y3)是第一端点
double y_3 = ey - arrXY_1[1];
double x_4 = ex - arrXY_2[0]; // (x4,y4)是第二端点
double y_4 = ey - arrXY_2[1];
Double X3 = new Double(x_3);
x3 = X3.intValue();
Double Y3 = new Double(y_3);
y3 = Y3.intValue();
Double X4 = new Double(x_4);
x4 = X4.intValue();
Double Y4 = new Double(y_4);
y4 = Y4.intValue();
// 画线
g.drawLine(sx, sy, ex, ey);
GeneralPath triangle = new GeneralPath();
triangle.moveTo(ex, ey);
triangle.lineTo(x3, y3);
triangle.lineTo(x4, y4);
triangle.closePath();
//实心箭头
g.fill(triangle);
//非实心箭头
//g.draw(triangle);
}
public static double[] rotateVec(int px, int py, double ang,
boolean isChLen, double newLen) {
double mathstr[] = new double[2];
// 矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度 double vx = px * Math.cos(ang) - py * Math.sin(ang);
double vy = px * Math.sin(ang) + py * Math.cos(ang);
if (isChLen) {
double d = Math.sqrt(vx * vx + vy * vy);
vx = vx / d * newLen;
vy = vy / d * newLen;
mathstr[0] = vx;
mathstr[1] = vy;
}
return mathstr;
}
}
Recorder.java
package com.recorder;
import java.awt.Point;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Vector;
import com.view.DrawPanel;
public class Recorder {
FileWriter fw=null;
BufferedWriter bw=null;
FileReader fr=null;
BufferedReader br=null;
//保存结点记录
public void keepNodeRecord(){
try {
//创建
fw=new FileWriter("D://myNodeRecording.txt");
bw=new BufferedWriter(fw);
for(int i=0;i Point p=DrawPanel.nodes.get(i); String recode=p.x+" "+p.y; bw.write(recode+"\r\n"); } } catch (Exception e) { e.printStackTrace(); }finally{