合肥工业大学操作系统绘制前驱图_第1页
合肥工业大学操作系统绘制前驱图_第2页
合肥工业大学操作系统绘制前驱图_第3页
合肥工业大学操作系统绘制前驱图_第4页
合肥工业大学操作系统绘制前驱图_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE1课程设计设计题目 绘制描述事件先后顺序的前驱图设计题目学生姓名号 学生姓名号学号指导教师学号指导教师专业班级 计算机科学与技术09-22010年6月20日合肥工业大学课程设计任务书第一章课程设计概述1.1设计任务:设计一个可以绘制前驱图的界面程序1.2设计要求:建立前驱图的数据结构描述;建立绘制前驱图的例程,包括结点和有向边;可以删除、添加结点或有向边;可用鼠标在窗口的任意位置指点,确定结点或有向边位置;可以拖动现有结点的位置,与该结点相连的有向边也随之移动;可以将前驱图存入文件,从文件中取出;第二章开发环境Javajdk1.6,eclipse程序算法与实现绘制结点算法简述先绘制一个圆,将数字转化为字符,再在圆中绘制字符绘制带剪头直线算法简述先绘制一条直线,在直线的一端绘制一个三角形程序实现数据结构Vector<Point>利用vector向量容器存放point数据结构第五章程序实现程序清单Node.javapackagecom.draw;importjava.awt.Graphics2D;publicclassNode{ /*绘制结点函数*/ publicvoiddrawNode(intx,inty,intn,Graphics2Dg){ Stringstr=Integer.toString(n); g.drawOval(x,y,20,20); g.drawString(str,x+7,y+15); }}Line.javapackagecom.draw;importjava.awt.Graphics2D;importjava.awt.geom.GeneralPath;publicclassLine{ /*绘制直线函数*/ publicvoiddrawLine(intsx,intsy,intex,intey,Graphics2Dg){ doubleH=10;//箭头高度doubleL=4;//底边的一半intx3=0;inty3=0;intx4=0;inty4=0;doubleawrad=Math.atan(L/H);//箭头角度doublearraow_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);doublex_3=ex-arrXY_1[0];//(x3,y3)是第一端点doubley_3=ey-arrXY_1[1];doublex_4=ex-arrXY_2[0];//(x4,y4)是第二端点doubley_4=ey-arrXY_2[1];DoubleX3=newDouble(x_3);x3=X3.intValue();DoubleY3=newDouble(y_3);y3=Y3.intValue();DoubleX4=newDouble(x_4);x4=X4.intValue();DoubleY4=newDouble(y_4);y4=Y4.intValue();//画线g.drawLine(sx,sy,ex,ey);GeneralPathtriangle=newGeneralPath();triangle.moveTo(ex,ey);triangle.lineTo(x3,y3);triangle.lineTo(x4,y4);triangle.closePath();//实心箭头g.fill(triangle);//非实心箭头//g.draw(triangle); } publicstaticdouble[]rotateVec(intpx,intpy,doubleang, booleanisChLen,doublenewLen){ doublemathstr[]=newdouble[2]; //矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度 doublevx=px*Math.cos(ang)-py*Math.sin(ang); doublevy=px*Math.sin(ang)+py*Math.cos(ang); if(isChLen){ doubled=Math.sqrt(vx*vx+vy*vy); vx=vx/d*newLen; vy=vy/d*newLen; mathstr[0]=vx; mathstr[1]=vy; } returnmathstr; } } Recorder.javapackagecom.recorder;importjava.awt.Point;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.FileReader;importjava.io.FileWriter;importjava.util.Vector;importcom.view.DrawPanel;publicclassRecorder{ FileWriterfw=null; BufferedWriterbw=null; FileReaderfr=null; BufferedReaderbr=null; //保存结点记录 publicvoidkeepNodeRecord(){ try{ //创建 fw=newFileWriter("D://myNodeRecording.txt"); bw=newBufferedWriter(fw); for(inti=0;i<DrawPanel.nodes.size();i++){ Pointp=DrawPanel.nodes.get(i); Stringrecode=p.x+""+p.y; bw.write(recode+"\r\n"); } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ bw.close(); fw.close(); }catch(Exceptione2){ e2.printStackTrace(); } } } //重置nodes的值 publicvoidsetNodes(){ try{ fr=newFileReader("D://myNodeRecording.txt"); br=newBufferedReader(fr); Stringn=""; DrawPanel.nodes.clear(); while((n=br.readLine())!=null){ String[]xy=n.split(""); Pointp=newPoint(Integer.parseInt(xy[0]),Integer.parseInt(xy[1])); DrawPanel.nodes.add(p); } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ br.close(); fr.close(); }catch(Exceptione2){ e2.printStackTrace(); } } } //保存point记录 publicvoidkeepPointRecord(){ try{ //创建 fw=newFileWriter("D://myPointRecording.txt"); bw=newBufferedWriter(fw); for(inti=0;i<DrawPanel.point2.size();i++){ Pointp1=DrawPanel.point1.get(i); Pointp2=DrawPanel.point2.get(i); Stringrecode=p1.x+""+p1.y+""+p2.x+""+p2.y; bw.write(recode+"\r\n"); } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ bw.close(); fw.close(); }catch(Exceptione2){ e2.printStackTrace(); } } } //设置point1的值 publicvoidsetPoint(){ try{ fr=newFileReader("D://myPointRecording.txt"); br=newBufferedReader(fr); Stringn=""; DrawPanel.point1.clear(); DrawPanel.point2.clear(); while((n=br.readLine())!=null){ String[]x1y1x2y2=n.split(""); Pointp1=newPoint(Integer.parseInt(x1y1x2y2[0]),Integer.parseInt(x1y1x2y2[1])); DrawPanel.point1.add(p1); Pointp2=newPoint(Integer.parseInt(x1y1x2y2[2]),Integer.parseInt(x1y1x2y2[3])); DrawPanel.point2.add(p2); } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ br.close(); fr.close(); }catch(Exceptione2){ e2.printStackTrace(); } } }}DrawPanel.javapackagecom.view;importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Point;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.event.MouseMotionListener;importjava.util.Vector;importjavax.swing.JPanel;importcom.draw.Line;importcom.draw.Node;publicclassDrawPanelextendsJPanelimplementsMouseMotionListener,MouseListener{ staticintcommand; //被选中索引 intselectNode=-1; intselectLine=-1; //定义结点向量组 publicstaticVector<Point>nodes=newVector<Point>(); //第一直线点向量组 publicstaticVector<Point>point1=newVector<Point>(); publicstaticVector<Point>point2=newVector<Point>(); ToolPaneltoolPanel=newToolPanel(); Linel=newLine(); Noden=newNode(); DrawPanel(){ addMouseMotionListener(this); addMouseListener(this); setBackground(Color.WHITE);//设置drawpanel背景色 } publicvoidpaint(Graphicsg){ super.paint(g); Graphics2Dg2=(Graphics2D)g; if(nodes!=null){ for(inti=0;i<nodes.size();i++){ Pointnodestmp=nodes.get(i); n.drawNode(nodestmp.x,nodestmp.y,i,g2); } } if(point1!=null&&point2!=null){ for(intj=0;j<point2.size();j++){ Pointlinetmp1=point1.get(j); Pointlinetmp2=point2.get(j); l.drawLine(linetmp1.x,linetmp1.y,linetmp2.x,linetmp2.y,g2); } } repaint(); } /*判断鼠标是否选中结点*/ booleanisSelectedNode(intx,inty){ booleanisSelected=false; for(inti=0;i<nodes.size();i++) { intm=nodes.get(i).x; intn=nodes.get(i).y; if(x>=m&&x<=m+20&&y>=n&&y<=y+20){ isSelected=true; selectNode=i; } } returnisSelected; } /*判断鼠标是否选中直线*/ booleanisSelectedLine(intx,inty){ booleanisSelected=false; Pointp=newPoint(x,y); for(inti=0;i<point2.size();i++){ Pointstart=point1.get(i); Pointend=point2.get(i); if(isPointOnLine(p,start,end)){ isSelected=true; selectLine=i; } } returnisSelected; } /*判断点是否在直线上*/ booleanisPointOnLine(Pointp,Pointstart,Pointend){ intdiv=10;intxEnd=end.x-start.x;intyEnd=start.y-end.y;intx2=p.x-start.x;inty1=start.y-p.y-div;inty2=start.y-p.y+div;doubletan1=Math.atan2(yEnd,xEnd);doubletan2=Math.atan2(y1,x2);doubletan3=Math.atan2(y2,x2);returntan1>=tan2&&tan1<=tan3;} /*MouseListener*/ /*按下并释放触发*/ publicvoidmouseClicked(MouseEvente){ intx=e.getX(); inty=e.getY(); Pointp=newPoint(x,y); if(command==toolPanel.drawNode){ nodes.add(p); } if(command==toolPanel.deleteCommand){ if(isSelectedNode(x,y)){ nodes.remove(selectNode);// System.out.println(select+"isSelected"); } if(isSelectedLine(x,y)){ point1.remove(selectLine); point2.remove(selectLine); } }} /*按下鼠标键触发*/ publicvoidmousePressed(MouseEvente){ if(command==toolPanel.drawLine){ int x1=e.getX(); int y1=e.getY(); Pointp1=newPoint(x1,y1); point1.add(p1); } } /*释放鼠标键触发*/ publicvoidmouseReleased(MouseEvente){ if(command==toolPanel.drawLine){ intx2=e.getX(); inty2=e.getY(); Pointp2=newPoint(x2,y2); point2.add(p2); } } /*鼠标指针进入主键触发*/ publicvoidmouseEntered(MouseEvente){ } /*鼠标指针离开触发*/ publicvoidmouseExited(MouseEvente){ }ToolPanel.javapackagecom.view;importjava.awt.Button;importjava.awt.Color;importjava.awt.FileDialog;importjava.awt.FlowLayout;importjava.awt.Label;importjava.awt.TextField;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JPanel;importcom.recorder.Recorder;publicclassToolPanelextendsJPanelimplementsActionListener{ //定义一个recorder对象 Recorderrecorder=newRecorder(); /*命令值*/ intclearCommand=0; intopenCommand=1; intsaveCommand=2; intdrawNode=3; intdrawLine=4; intmoveCommand=5; intdeleteCommand=6; FlowLayoutflowLayou;//添加布局 Labellabel1;//工具栏标签 Labellabel2;//当前动作标签 Buttonclear; Buttonopen; Buttonsave; Buttonnode; Buttonline; Buttonmove; Buttondelete; TextFieldfield;//显示动作文本区 //定义两个类对象,方便调用 MainFrameframe; //定义对话框// FileDialogfileDialog_save=newFileDialog(frame,"保存文件对话框",FileDialog.SAVE);;// FileDialogfileDialog_load=newFileDialog(frame,"打开文件对话框",FileDialog.LOAD); ToolPanel(){ FlowLayoutflowLayout=newFlowLayout(); setBackground(Color.LIGHT_GRAY);//设置toolpanel背景色 //添加控件 label1=newLabel("工具栏:"); clear=newButton("清空"); open=newButton("打开"); save=newButton("保存"); node=newButton("结点"); line=newButton("连线"); move=newButton("移动"); delete=newButton("删除"); label2=newLabel("当前动作:"); field=newTextField(10); //控件添加到控件组件上 add(label1); add(clear); add(open); add(save); add(node); add(line); add(move); add(delete); add(label2); add(field); //注册监听 clear.addActionListener(this); open.addActionListener(this); save.addActionListener(this); node.addActionListener(this); line.addActionListener(this); move.addActionListener(this); delete.addActionListener(this); //布局定义 flowLayout.setAlignment(flowLayout.LEADING); setLayout(flowLayout); } /*设置命令类型*/ voidsetCommand(intstyle){ DrawPmand=style; } publicvoidactionPerformed(ActionEvente){ if(e.getSource()==clear){ field.setText(clear.getLabel()); setCommand(clearCommand); DrawPanel.nodes.clear(); DrawPanel.point1.clear(); DrawPanel.point2.clear(); } if(e.getSource()==open){ field.setText(open.getLabel()); setCommand(openCommand); //fileDialog_load.setVisible(true); recorder.setNodes(); recorder.setPoint(); } if(e.getSource()==save){ field.setText(save.getLabel()); setCommand(saveCommand); //fileDialog_save.setVisible(true); recorder.keepNodeRecord(); recorder.keepPointRecord();// Sys

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论