图象细化算法实现的java applet源代码

来源:互联网 发布:pm designer软件下载 编辑:程序博客网 时间:2024/04/28 07:19

//相关文章: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;

原创粉丝点击