0

i try to implement this java applet source code into java application with using JFrame but it doesn't work. and i changed little bit to read file from my computer but it also doesn't work.

how can i convert this into application?

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.URL;

class Node {
 int x;
 int y;
 int delta_plus; /* edge starts from this node */
 int delta_minus; /* edge terminates at this node */
 int dist;  /* distance from the start node */
 int prev;  /* previous node of the shortest path */
 int succ,pred; /* node in Sbar with finite dist. */
 int w;
 int h;
 int pw;
 int dx;
 int dy;
 String name;
}

class Edge {
 int rndd_plus; /* initial vertex of this edge */
 int rndd_minus; /* terminal vertex of this edge */
 int delta_plus; /* edge starts from rndd_plus */
 int delta_minus; /* edge terminates at rndd_minus */
 int len;  /* length */
     String name;
}

public class Prim extends Applet implements MouseListener {
 int n,m;
 int u,snode; /* start node */
 int pre_s_first, pre_s_last;
 boolean isdigraph;
 int iteration, step;
 Node v[] = new Node[100];
 Edge e[] = new Edge[200];

 int findNode(String name) {
  for (int i=0; i<n; i++)
   if (v[i].name.equals(name))
    return i;
  return -1;
 }

 void input_graph(InputStream is) throws IOException {
  int x,y,l;
  String s;

  Reader r = new BufferedReader(new InputStreamReader(is));
  StreamTokenizer st = new StreamTokenizer(r);
  st.commentChar('#');
  st.nextToken(); n = (int)st.nval;
  st.nextToken(); m = (int)st.nval;
  st.nextToken(); s = st.sval;
  isdigraph = "digraph".equals(s);
  for (int i = 0; i<n; i++) {
   Node node = new Node();
   st.nextToken(); node.name = st.sval;
   st.nextToken(); node.x = (int)st.nval;
   st.nextToken(); node.y = (int)st.nval;
   v[i] = node;
  }
  for (int i = 0; i<m; i++) {
   Edge edge = new Edge();
   st.nextToken(); edge.name = st.sval;
   switch (st.nextToken()) {
   case StreamTokenizer.TT_NUMBER:
    edge.rndd_plus = (int)st.nval;
    break;
   case StreamTokenizer.TT_WORD:
    edge.rndd_plus = findNode(st.sval);
    break;
   default:
    break;
   }
   switch (st.nextToken()) {
   case StreamTokenizer.TT_NUMBER:
    edge.rndd_minus = (int)st.nval;
    break;
   case StreamTokenizer.TT_WORD:
    edge.rndd_minus = findNode(st.sval);
    break;
   default:
    break;
   }
   st.nextToken(); edge.len = (int)st.nval;
   e[i] = edge;
  }
  for (int i=0; i<n; i++) {
   v[i].succ = v[i].pred = -2;
   v[i].prev = v[i].dist = -1;
   v[i].pw = 0;
  }
  iteration = step = 0;
 }

 void rdb() {
  int i,k;

  for (i=0; i<n; i++)
   v[i].delta_plus = v[i].delta_minus = -1;
  for (i=0; i<m; i++)
   e[i].delta_plus = e[i].delta_minus = -1;
  for (i=0; i<m; i++) {
   k = e[i].rndd_plus;
   if (v[k].delta_plus == -1)
    v[k].delta_plus = i;
   else {
    k = v[k].delta_plus;
    while(e[k].delta_plus >= 0)
     k = e[k].delta_plus;
    e[k].delta_plus = i;
   }
   k = e[i].rndd_minus;
   if (v[k].delta_minus == -1)
    v[k].delta_minus = i;
   else {
    k = v[k].delta_minus;
    while(e[k].delta_minus >= 0)
     k = e[k].delta_minus;
    e[k].delta_minus = i;
   }
  }
 }

 void append_pre_s(int i) {
  v[i].succ = v[i].pred = -1;
  if (pre_s_first<0)
   pre_s_first = i;
  else
   v[pre_s_last].succ = i;
  v[i].pred = pre_s_last;
  pre_s_last = i;
 }

 void remove_pre_s(int i) {
  int succ = v[i].succ;
  int pred = v[i].pred;

  if (succ>=0)
   v[succ].pred = pred;
  else
   pre_s_last = pred;
  if (pred>=0)
   v[pred].succ = succ;
  else
   pre_s_first = succ;
 }

 void step1() {  /* initialize */
  u = snode;
  for (int i=0; i<n; i++) {
   v[i].succ = v[i].pred = -2;
   v[i].prev = v[i].dist = -1;
  }
  v[u].succ = -3;
  v[u].dist = 0;
  pre_s_first = pre_s_last = -1;
 }

 void step2() {  /* replace labels */
  int i,j;

  j = v[u].delta_plus;
  while (j>=0) {
   i = e[j].rndd_minus;
   if ((v[i].succ>=-2)&&((v[i].dist<0)||
    (v[i].dist>e[j].len))) {
    if (v[i].dist<0)
     append_pre_s(i);
    v[i].dist = e[j].len;
    v[i].prev = u;   /* label */
   }
   j = e[j].delta_plus;
  }
  if (!isdigraph) {
  j = v[u].delta_minus;
  while (j>=0) {
   i = e[j].rndd_plus;
   if ((v[i].succ>=-2)&&((v[i].dist<0)||
    (v[i].dist>e[j].len))) {
    if (v[i].dist<0)
     append_pre_s(i);
    v[i].dist = e[j].len;
    v[i].prev = u;   /* label */
   }
   j = e[j].delta_minus;
  }
  }
  v[u].succ = -4;
 }

 void step3() {  /* find the shortest node in Sbar */
  int i,rho;

  rho = -1;
  for (i = pre_s_first; i>=0; i = v[i].succ) {
   if ((rho < 0)||(rho>v[i].dist)) {
    rho = v[i].dist;
    u = i;
   }
  }
  remove_pre_s(u);
  v[u].succ = -3;
 }

 void step4() {
  v[u].succ = -4;
 }

 double weight(Node n, double x, double y) {
  double w,z,xx,yy;

  w = 0;
  for (int j = n.delta_plus; j>=0; j=e[j].delta_plus) {
   xx = (double)(v[e[j].rndd_minus].x - n.x);
   yy = (double)(v[e[j].rndd_minus].y - n.y);
   z = (x*xx+y*yy)/Math.sqrt((x*x+y*y)*(xx*xx+yy*yy))+1.0;
   w += z*z*z*z;
  }
  for (int j = n.delta_minus; j>=0; j=e[j].delta_minus) {
   xx = (double)(v[e[j].rndd_plus].x - n.x);
   yy = (double)(v[e[j].rndd_plus].y - n.y);
   z = (x*xx+y*yy)/Math.sqrt((x*x+y*y)*(xx*xx+yy*yy))+1.0;
   w += z*z*z*z;
  }
  return w;
 }

 void init_sub() {
  int x[] = {1, 0, -1, 1, 0, -1};
  int y[] = {1, 1, 1, -1, -1, -1};
  int  i,j,k;
  double w,z;

  for (i=0; i<n; i++) {
   k=0;
   w=weight(v[i],(double)x[0],(double)y[0]);
   for (j=1; j<6; j++) {
    z=weight(v[i],(double)x[j],(double)y[j]);
    if (z<w) {
     w = z;
     k = j;
    }
   }
   v[i].dx = x[k];
   v[i].dy = y[k];
  }
 }

 public void init() {
  try {
   InputStream is;

   is = new URL("input address").openStream();
   input_graph(is);
   try {
    if (is != null)
     is.close();
    } catch(Exception e) {
   }
  } catch (FileNotFoundException e) {
   System.err.println("File not found.");
  } catch (IOException e) {
   System.err.println("Cannot access file.");
  }

  String s = getParameter("start");
  if (s != null)
   snode = Integer.parseInt(s);
  else
   snode = 0;

  setBackground(Color.white);
  rdb();
  init_sub();
  addMouseListener(this);
 }

 public void paintNode(Graphics g, Node n, FontMetrics fm) {
  String s;
  int x = n.x;
  int y = n.y;
  int w = fm.stringWidth(n.name) + 10;
  int h = fm.getHeight() + 4;
  n.w = w;
  n.h = h;

  if (n.succ<-2)
   g.setColor(Color.blue);
  else if (n.succ==-2)
   g.setColor(Color.gray);
  else
   g.setColor(Color.red);

  g.drawRect(x-w/2,y-h/2,w,h);

  if (n.succ==-4)
   g.setColor(Color.cyan);
  else if (n.succ==-3)
   g.setColor(Color.pink);
  else if (n.succ>-2)
   g.setColor(Color.yellow);
  else
   g.setColor(getBackground());

  g.fillRect(x-w/2+1,y-h/2+1,w-1,h-1);

  g.setColor(Color.black);
  g.drawString(n.name,x-(w-10)/2,(y-(h-4)/2)+fm.getAscent());


  if (n.dist<0)
   s = "";
  else
   s = ""+n.dist;
  w = fm.stringWidth(s) + 10;
  x += (h+1)*n.dx; y += (h+1)*n.dy;
  g.setColor(getBackground());
  g.fillRect(x-n.pw/2,y-h/2,n.pw,h);
  n.pw = w;
  if (n.succ<-2)
   g.setColor(Color.blue);
  else
   g.setColor(Color.red);
  g.drawString(s,x-(w-10)/2,y-(h-4)/2+fm.getAscent());
 }

 int [] xy(int a, int b, int w, int h) {
  int x[] = new int[2];

  if (Math.abs(w*b)>=Math.abs(h*a)) {
   x[0] = ((b>=0)?1:-1)*a*h/b/2;
   x[1] = ((b>=0)?1:-1)*h/2;
  } else {
   x[0] = ((a>=0)?1:-1)*w/2;
   x[1] = ((a>=0)?1:-1)*b*w/a/2;
  }
  return x;
 }

 void drawArrow(Graphics g,int x1,int y1,int x2,int y2) {
  int a = x1-x2;
  int b = y1-y2;

  if (isdigraph) {
  double aa = Math.sqrt(a*a+b*b)/16.0;
  double bb = b/aa;
   aa = a/aa;
  g.drawLine(x2,y2,x2+(int)((aa*12+bb*5)/13),y2+(int)((-aa*5+bb*12)/13));
  g.drawLine(x2,y2,x2+(int)((aa*12-bb*5)/13),y2+(int)((aa*5+bb*12)/13));
  }
  g.drawLine(x1,y1,x2,y2);
 }

 public void paintEdge(Graphics g, Edge e, FontMetrics fm) {
  Node v1 = v[e.rndd_plus];
  Node v2 = v[e.rndd_minus];

  int a = v1.x-v2.x;
  int b = v1.y-v2.y;

  int x1[] = xy(-a,-b,v1.w,v1.h);
  int x2[] = xy(a,b,v2.w,v2.h);

  if (v2.prev == e.rndd_plus) {
   if ((v1.succ<-2)&&(v2.succ>=-2))
      g.setColor(Color.red);
   else
    g.setColor(Color.blue);
  } else {
   g.setColor(Color.lightGray);
  }
  if ((!isdigraph)&&(v1.prev == e.rndd_minus)) {
      if ((v2.succ<-2)&&(v1.succ>=-2))
        g.setColor(Color.red);
  else
    g.setColor(Color.blue);
  }
  drawArrow(g,v1.x+x1[0],v1.y+x1[1],v2.x+x2[0],v2.y+x2[1]);

  int w = fm.stringWidth("" + e.len);
  int h = fm.getHeight();

  g.setColor(getBackground());
  g.fillRect((v1.x+v2.x-w)/2,(v1.y+v2.y-h)/2,w,h);

  if ((v2.prev == e.rndd_plus)||
      ((!isdigraph)&&(v1.prev == e.rndd_minus)))
   g.setColor(Color.black);
  else
   g.setColor(Color.lightGray);
  g.drawString("" + e.len,(v1.x+v2.x-w)/2,(v1.y+v2.y-h)/2+fm.getAscent());
 }

 public void paint(Graphics g) {
  FontMetrics fm = g.getFontMetrics();
  for (int i=0; i<n; i++)
   paintNode(g,v[i],fm);
      for (int i=0; i<m; i++)
       paintEdge(g,e[i],fm);
 }

 public void update(Graphics g) {
  paint(g);
 }

 public void mousePressed(MouseEvent ev) {
  if (iteration==0) {
   step1();
   iteration++;
   step = 2;
  } else if (iteration>=n) {
   step4();
//   iteration = 0;
  } else {
   if (step == 2) {
    step2();
    step = 3;
   } else {
    step3();
    iteration++;
    step = 2;
   }
  }
 repaint();
 }
 public void mouseClicked(MouseEvent event) {}
 public void mouseReleased(MouseEvent event) {}
 public void mouseEntered(MouseEvent event) {}
 public void mouseExited(MouseEvent event) {}
}
1
  • 2
    Sorry, but SO is not a "do my work for free" service. Commented May 29, 2011 at 9:04

2 Answers 2

1

Here are some links for you to read:

And there are lots of others. (Google is your friend.)

If this doesn't help, feel free to ask a specific question.

Sign up to request clarification or add additional context in comments.

Comments

0

You can try adding this:

 public static void main(String[] args) {
     Prim prim = new Prim() {
         @Override
         public String getParameter(String key) {
             if ("start".equals(key)) {
                 return "0";
             }
             else {
                 return "";
             }
         }
     };
     prim.init();
 }

BTW, you should put in a real value for URL("input address").

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.