//相关文章:java applet PseudoScreen类源代码
//thinning Algorithm
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.EventObject;
public class Thin extends Applet
implements ActionListener, MouseListener
{
public Thin()
{
ps = new PseudoScreen(40, 40);
b1 = new Button("Start");
b2 = new Button("Reset");
icase = 2;
flag = false;
fonsig = new Font("TimesRoman", 2, 10);
}
public void init()
{
add(b1);
add(b2);
b1.addActionListener(this);
b2.addActionListener(this);
addMouseListener(this);
b2.setEnabled(false);
}
public void paint(Graphics g)
{
if(icase == 2)
{
ps.Screen(10, g, true);
setImg();
b2.setEnabled(false);
b1.setEnabled(true);
flag = true;
} else
if(icase == 1)
{
ps.Screen(10, g, false);
makeThin();
b2.setEnabled(true);
b1.setEnabled(false);
flag = false;
} else
{
ps.Screen(10, g, false);
if(ps.getPixel(xp, yp) == 0)
ps.setPixel(xp, yp, 1);
else
ps.setPixel(xp, yp, 0);
}
g.setColor(Color.red);
g.setFont(fonsig);
g.drawString("R.Mukundan/COSC/U.Canterbury", 1, 350);
}
public void actionPerformed(ActionEvent actionevent)
{
if(actionevent.getSource() == b1)
icase = 1;
else
icase = 2;
repaint();
}
public void mouseClicked(MouseEvent mouseevent)
{
if(!flag)
{
return;
} else
{
xp = mouseevent.getX() / 10;
yp = mouseevent.getY() / 10;
icase = 3;
repaint();
return;
}
}
public void mouseEntered(MouseEvent mouseevent)
{
}
public void mouseExited(MouseEvent mouseevent)
{
}
public void mouseReleased(MouseEvent mouseevent)
{
}
public void mousePressed(MouseEvent mouseevent)
{
}
public void update(Graphics g)
{
paint(g);
}
void setImg()
{
String as[] = {
"........................................", "........................................", ".......................*****............", "...................************.........", ".............*********........******....", "..........******.................*****..", ".......****.......................*****.", ".....*****........................*****.", "....*****........................******.", "...*****........................******..",
"...*****.......................*******..", "..*****......................********...", "..******....................********....", ".*********...............**********.....", ".********************************.......", ".******************************.........", ".***************************............", ".***************........................", "..************..........................", "..**********............................",
"...*********............................", "...*********............................", "....*********...........................", "....*********...........................", ".....*********.......................*..", ".......**********..................**...", "...........*************........****....", "..............********************......", "...................*************........", "........................................",
"........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................"
};
for(int i = 0; i < 40; i++)
{
for(int j = 0; j < 40; j++)
if(as[i].charAt(j) != '.')
ps.setPixel(j, i, 1);
}
}
void makeThin()
{
boolean flag1;
do
{
flag1 = false;
for(int j = 0; j < 40; j++)
{
for(int k = 0; k < 40; k++)
if(ps.getPixel(k, j) == 1)
{
int i = nbors(k, j);
if(i > 2 && i < 7 && cindex(k, j) == 1)
ps.B[k][j] = 2;
}
}
for(int l = 0; l < 40; l++)
{
for(int i1 = 0; i1 < 40; i1++)
if(ps.getPixel(i1, l) == 2)
{
ps.clearPixel(i1, l);
flag1 = true;
slow();
}
}
} while(flag1);
}
int nbors(int i, int j)
{
int k = 0;
int ai[] = {
-1, -1, 0, 1, 1, 1, 0, -1
};
int ai1[] = {
0, -1, -1, -1, 0, 1, 1, 1
};
for(int l = 0; l < 8; l++)
if(ps.getPixel(i + ai[l], j + ai1[l]) > 0)
k++;
return k;
}
int cindex(int i, int j)
{
int k = 0;
int i1 = 0;
boolean flag1 = true;
int ai[] = {
-1, -1, 0, 1, 1, 1, 0, -1
};
int ai1[] = {
0, -1, -1, -1, 0, 1, 1, 1
};
for(int k1 = 0; k1 < 8; k1++)
{
if(flag1)
i1 = ps.getPixel(i + ai[k1], j + ai1[k1]);
int l = k1 + 1;
if(l == 8)
l = 0;
int j1 = ps.getPixel(i + ai[l], j + ai1[l]);
flag1 = true;
if(j1 != 1 && l % 2 == 1)
flag1 = false;
else
if(i1 == 1 && j1 != 1 || i1 != 1 && j1 == 1)
k++;
}
return k / 2;
}
void slow()
{
try
{
Thread.sleep(50L);
}
catch(Exception exception) { }
}
PseudoScreen ps;
Button b1;
Button b2;
int icase;
int xp;
int yp;
boolean flag;
Font fonsig;
}