?? transformview.java
字號:
package reg402;
import java.awt.*;
import javax.swing.*;
import java.util.LinkedList;
import java.util.Iterator;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
public class TransformView extends JPanel implements Constants {
TransformModel transModel;
Graph graph;
//保存每個結點經過任意個ε轉換到達的其他結點ID號
private ArrayList[] ETable;
//保存在每個轉換字母上的兩個關聯結點的ID號
private ArrayList[] transTable;
//保存轉換表的數據
String[][] DfaTable;
public TransformView(TransformModel transModel) {
this.transModel = transModel;
this.setPreferredSize(new Dimension(400, 300));
this.setBackground(Color.orange);
}
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
super.paintComponent(g2d);
BasicStroke bs = new BasicStroke(1);
Rectangle graphBounds = transModel.getBounds();
Dimension size = this.getPreferredSize();
Point location = new Point((size.width - graphBounds.width)/2,
(size.height - graphBounds.height)/2);
Element arrowLink;
int x = 50 - graphBounds.x;
int y = 50 - graphBounds.y;
graph = transModel.getGraph();
graph.setCurrent(0);
//初始化數據結構
ETable= new ArrayList[transModel.node.length];
transTable=new ArrayList[transModel.regExp.length-1];
for(int i=0; i< transModel.node.length; i++)
{
ETable[i] = new ArrayList();
}
int i,j,k,t=0;
for(i=0,j=0; i<transTable.length; i++)
{
if (transModel.regExp[i].compareTo("|")!=0
&& transModel.regExp[i].compareTo("*")!=0
&& transModel.regExp[i].compareTo("(")!=0
&& transModel.regExp[i].compareTo(")")!=0)
{
//transTable每個元素第一個值保存一個轉換字母
transTable[j]=new ArrayList();
for(k=0; k<j; k++)
if(((String)transTable[k].get(0)).compareTo(transModel.regExp[i])==0)
break;
if(k==j)
{
transTable[j].add(transModel.regExp[i]);
j++;
}
}
}
//為轉換表申請空間
DfaTable=new String[transModel.node.length+1][];
for(i=0; i<DfaTable.length; i++)
DfaTable[i]=new String[j+1];
//初始化轉換表的列
DfaTable[0][0]="狀態\\轉換字符";
for(i=1; i<DfaTable[0].length; i++)
DfaTable[0][i]=(String)transTable[i-1].get(0);
//畫結點
for( i = 0; i < transModel.node.length; i++) {
Point curPoint = transModel.node[i].getPosition();
Element node = new Element.Circle(new Point(curPoint.x + x, curPoint.y + y),
RADIUS, bs, Color.black);
Ellipse2D ellipse = new Ellipse2D.Double(curPoint.x + x - RADIUS,
curPoint.y + y - RADIUS,
2*RADIUS, 2*RADIUS);
g2d.setPaint(Color.white);
g2d.fill(ellipse);
node.draw(g2d);
//畫狀態號
g2d.drawString((new Integer(i)).toString(),curPoint.x+x-3,curPoint.y+y+3);
}
//遍歷圖
while(graph.hasNext()) {
EdgeLink next = graph.getNext();
if (next != null) {
//邊的兩個點的位置
Point pa = next.n1.getPosition();
Point pb = next.n2.getPosition();
String label = next.getLabel();
//轉換字母是ε,則添加入ETable
if(label=="ε")
{
ETable[next.n1.getID()].add(next.n2.getID());
}
//否則添加入transTable
else
{
i=0;
while( (( (String) transTable[i].get(0) ).compareTo(label))!=0) i++;
transTable[i].add(new Point(next.n1.getID(),next.n2.getID()));
}
Rectangle interPoint = intersectPoint(pa, pb);
Point p1 = new Point(interPoint.x, interPoint.y);
Point p2 = new Point(interPoint.width, interPoint.height);
if((Math.abs(p2.x - p1.x) <= 4*RADIUS && p1.x < p2.x) || p1.y != p2.y) {
//普通的線, 由兩點X距離和Y距離決定
arrowLink = new Element.ArrowLine(new Point(p1.x + x, p1.y + y),
new Point(p2.x + x, p2.y + y),
new BasicStroke(1), Color.black,
label);
arrowLink.draw(g2d);
}
}
}
//實現將每個結點經過任意個ε能到達的結點ID號添加入每個數組元素
for(i=0; i<ETable.length; i++){
for(j=0; j<ETable[i].size(); j++){
LookBack(i,((Integer)ETable[i].get(j)).intValue());
}
}
Point pointa = graph.getStart().getPosition();
Point pointb = new Point(pointa.x - 4*RADIUS, pointa.y);
Rectangle interPoint = intersectPoint(pointa, pointb);
Point point2 = new Point(interPoint.x, interPoint.y);
Point point1 = new Point(interPoint.width, interPoint.height);
arrowLink = new Element.ArrowLine(new Point(point1.x + x, point1.y + y),
new Point(point2.x + x, point2.y + y),
new BasicStroke(1), Color.black,
"ε");
arrowLink.draw(g2d);
LinkedList list = transModel.getSpecialEdge();
Iterator iter = list.iterator();
while(iter.hasNext()) {
SpecialEdge special = (SpecialEdge)iter.next();
EdgeLink edge = special.getEdge();
Point pb = edge.n1.getPosition();
Point pa = edge.n2.getPosition();
String label = edge.getLabel();
Rectangle bounds = special.getBounds();
if(pa.x < pb.x ) { //*運算中的向前循環
Point p2 = new Point(pa.x, pa.y - RADIUS);
Point p1 = new Point(pb.x, pb.y - RADIUS);
arrowLink = new Element.ArrowLine(new Point(p1.x + x, p1.y + y),
new Point(p1.x + x,
p1.y + y + bounds.y + RADIUS),
new Point(p2.x + x,
p2.y + y + bounds.y + RADIUS),
new Point(p2.x + x, p2.y + y),
new BasicStroke(1), Color.black,
label);
}
else { //隔著幾個結點的線
Point p2 = new Point(pa.x, pa.y + RADIUS);
Point p1 = new Point(pb.x, pb.y + RADIUS);
arrowLink = new Element.ArrowLine(new Point(p1.x + x, p1.y + y),
new Point(p1.x + x,
p1.y + y + bounds.height + bounds.y - RADIUS),
new Point(p2.x + x,
p2.y + y + bounds.height + bounds.y - RADIUS),
new Point(p2.x + x, p2.y + y),
new BasicStroke(1), Color.black,
label);
}
arrowLink.draw(g2d);
}
//取得圖的起始ID號
int startID=graph.getStart().getID();
String startString=Integer.toString(startID)+",";
//查ETable表,取得起始結點的ε-閉包,保存于startString
for(i=0; i<ETable[startID].size(); i++)
startString+=Integer.toString((Integer)ETable[startID].get(i))+",";
//為轉換表賦值
DfaTable[1][0]=startString;
int DfaPos=1,DfaEnd=1;
int commar=0,curID=0,temp=0;
String curString="",blankString="";
//while循環功能:生成轉換表
while(DfaPos<=DfaEnd)
{
for(i=1; i<DfaTable[0].length ; i++){
curString = DfaTable[DfaPos][0];
blankString="";
while (curString.compareTo("") != 0) {
commar = curString.indexOf(",");
curID = Integer.valueOf(curString.substring(0, commar));
curString = curString.substring(commar + 1);
for(j=1; j<transTable[i-1].size(); j++)
if(curID==((Point)transTable[i-1].get(j)).x){
blankString +=
Integer.toString(((Point) transTable[i -
1].get(j)).y) + ",";
}
}
String tempString=blankString;
while(tempString.compareTo("")!=0){
try{
commar = tempString.indexOf(",");
temp = Integer.valueOf(tempString.substring(0, commar));
tempString = tempString.substring(commar + 1);
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"這樣的表達式是沒有意義的!請重新輸入","402告訴你:",0);
System.exit(0);
}
String blanktemp;
boolean flag=true;
for(k=0; k<ETable[temp].size(); k++)
{
blanktemp=blankString;
flag=true;
while(blanktemp.compareTo("")!=0)
{
commar = blanktemp.indexOf(",");
String ss = blanktemp.substring(0, commar);
blanktemp = blanktemp.substring(commar + 1);
if ((((Integer) ETable[temp].get(k)).toString().
compareTo(ss)) == 0)
flag=false;
}
if(flag)
blankString += ((Integer) ETable[temp].get(k)).
toString() + ",";
}
//將找到的第一個狀態集合添加入轉換表相應位置
DfaTable[DfaPos][i]=blankString;
for( t=1; t<=DfaEnd; t++)
if(blankString.compareTo(DfaTable[t][0])==0) break;
}
//將此集合添加入下一行,以方便下一次生成其他狀態集合
if(t>DfaEnd)
DfaTable[++DfaEnd][0]=blankString;
}
DfaPos++;
}
g2d.dispose();
}
public Rectangle intersectPoint(Point center1, Point center2) {
double l = Math.sqrt((center2.x - center1.x)*(center2.x - center1.x) +
(center2.y - center1.y)*(center2.y - center1.y));
int x1 = (int)(RADIUS/l*(center2.x - center1.x)) + center1.x;
int y1 = (int)(RADIUS/l*(center2.y - center1.y)) + center1.y;
int x2 = (int)((l - RADIUS)/l*(center2.x - center1.x)) + center1.x;
int y2 = (int)((l - RADIUS)/l*(center2.y - center1.y)) + center1.y;
return new Rectangle(x1, y1, x2, y2);
}
//函數功能:見上面所述
private void LookBack(int CurPos, int newID)
{
for(int i=0; i<ETable.length; i++)
{
for(int j=0; j<ETable[i].size(); j++)
{
if (((Integer)(ETable[i].get(j))).intValue()==CurPos && EExit(i,newID))
{
ETable[i].add(newID);
LookBack(i,newID);
}
}
}
}
//函數功能:判斷ETable當前行有無重復的ID號,有則不添加新的ID號
private boolean EExit(int i,int newID){
for(int j=0; j<ETable[i].size(); j++)
if(((Integer)ETable[i].get(j)).intValue()==newID)
return false;
return true;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -