Praca z pikselami

0

Witam,

mam problem, chcialbym moc zmieniac obrazek, a dokladnie wylaczac i wlaczac poszczegolne piksele, aby moc uzyskac poodbny efekt do tego http://www.cbu.edu/~pong/ai/bam/bamapplet.html

I nie za bardzo wiem jak sie do tego zbaarc, obiekt jakiej klasy moge strorzyc aby moc sie tak bawic,
po drugie stworzylem sobie takie male obrazki czarno-biale np. 7x7 pikseli. I jak je powiekszyc na JPanel, i i w jakis sposob zminiac piksele z bialych na czarne ??? Czy zupelnei za ten problem nalezy zabrac sie inaczej ?? jestem w kropce

0
public class BamDraw extends JPanel {
	private int x; //ilosc kratek w poziomie
	private int y; //ilosc kratek w pionie

	private int pixelSize; //rozmiar kratki
	private Color filledCol; //kolor wypelnienia
	private Color defaultCol; //kolor planszy
	private Color lineCol; //kolor lini

	boolean [][] matrix; //macierz

	public BamDraw(int x, int y) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = 10;
		this.filledCol = Color.BLACK;
		this.defaultCol = Color.WHITE;
		this.lineCol = Color.BLACK;
		this.setOpaque(false);

		initMatrix();
	}

	public BamDraw(int pixelSize,int x,int y) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = pixelSize;
		this.filledCol = Color.BLACK;
		this.defaultCol = Color.WHITE;
		this.lineCol = Color.BLACK;
		this.setOpaque(false);

		initMatrix();
	}
	public BamDraw(int pixelSize, int x, int y, Color filledCol, Color defaultCol, Color lineCol) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = pixelSize;
		this.filledCol = filledCol;
		this.defaultCol = defaultCol;
		this.lineCol = lineCol;
		this.setOpaque(false);

		initMatrix();
	}

	private void initMatrix() {
		this.matrix = new boolean [x][y];
		for(int i=0; i<x; i++)
			for(int j=0; j<y; j++)
				matrix[i][j] = false;
	}
	public void setMatrix(boolean[][] matrix) {
		//sprawdzanie poprawnosci, jakies info o bledzie mozna dac
		if(matrix == null) return;
		try {
			if(matrix.length != this.matrix.length || matrix[0].length != this.matrix[0].length) return ;
		}catch(NullPointerException e) {
			return ;
		}catch(IndexOutOfBoundsException e) {
			return ;
		}
		this.matrix = matrix;
		repaint();
		revalidate();
	}

	public Dimension getPreferredSize() {
		return new Dimension(x*pixelSize +(x+1), y*pixelSize+ (y +1)); //plus linie
	}

	private void paintMatrix(Graphics g) {
		g.setColor(defaultCol);
		g.fillRect(0, 0, getPreferredSize().width, getPreferredSize().height);
		drawGrid(g);

		for(int i=0; i<matrix.length; i++) {
			for(int j=0; j<matrix[0].length; j++) {
				if(matrix[i][j]) {
					g.setColor(filledCol);
				} else {
					g.setColor(defaultCol);
				}
				g.fillRect(pixelSize*i +(i+1), pixelSize*j+(j+1),pixelSize, pixelSize);
			}
		}
	}
	private void drawGrid(Graphics g) {
		g.setColor(lineCol);
		for(int i=0; i<=getPreferredSize().width; i+=pixelSize+1) {
			g.drawLine(i, 0, i, this.getPreferredSize().height);
		}
		for(int j=0; j<=getPreferredSize().height; j+=pixelSize+1) {
			g.drawLine(0, j, getPreferredSize().width, j);
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		paintMatrix(g);
	}
}
...
BamDraw bam = new BamDraw(10,5,5);
this.getContentPane().add(bam);
bam.setBounds(5,5, bam.getPreferredSize().width, bam.getPreferredSize().height);

boolean[][] matrix = new boolean [5][5];
Random rnd =new Random();
for(int i=0; i <matrix.length; i++) {
	for(int j=0; j<5; j++) {
		matrix[i][j] = rnd.nextBoolean();
	}
}
bam.setMatrix(matrix);
...
0

Hej, dzieki za odpowiedz, ale nie jestem jakims spuer specjalista :/ i mam maly problem.

Jak sie domyslam, to jest konstruktor BamDraw:

jacobus2k napisał(a)
public BamDraw(int x, int y) {
                super();
                this.x =x;
                this.y =y;
                this.pixelSize = 10;
                this.filledCol = Color.BLACK;
                this.defaultCol = Color.WHITE;
                this.lineCol = Color.BLACK;
                this.setOpaque(false);

                initMatrix();
        }

Pojawia sie InitMatrix() Hm... i ine za bardzo to rozumiem, dlaczego wstawiasz do niej same false ??

jacobus2k napisał(a)
this.matrix = new boolean [x][y];
                for(int i=0; i<x; i++)
                        for(int j=0; j<y; j++)
                                matrix[i][j] = false;

W moim programie mam glowna klase BAM, a wyglada to na razie tak:
a chcialbym aby po wyborze konkretnego CASE, rysowalo cos w wczytanie1Panel lub wczytanie2Panel dany rusek, i zebym mogl z tymi pixelami sie meczyc

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.;
import javax.swing.
;

import java.awt.;
import java.awt.event.
;
import java.awt.geom.*;

public class BAM extends JFrame {

private JFrame ramka;

private JPanel gornyPanel;
private JPanel dolnyPanel;
private JPanel malyDolnyPanel;
private JPanel wczytanie1Panel;
private JPanel wczytanie2Panel;
private JPanel wynik1Panel;
private JPanel wynik2Panel;

private JLabel wczytanie1Label;
private JLabel wczytanie2Label;
private JLabel wynik1Label;
private JLabel wynik2Label;

private JComboBox wczytanieComboBox;

private JButton krokButton;
private JButton startButton;

Image a1 = Toolkit.getDefaultToolkit().getImage("1a.jpg");
String rysunek[] = new String[64];

private void wczytanieComboboxActionPerformed(ActionEvent evt) {
	int opcja = wczytanieComboBox.getSelectedIndex();
	
	switch(opcja) {
    	case 0: 
    			
            	break;
    	case 1: 
    			
            	break;
    	case 2: 
    			
        		break;
    	case 3: 
    			
        		break;
    	case 4: 
    			
        		break;
    	case 5: 
    			
        		break;
	}
}

private void krokButtonActionPerformed(ActionEvent evt) {
	
}

private void startButtonActionPerformed(ActionEvent evt) {
	
}

public void initComponents() {
	ramka = new JFrame();
	
	gornyPanel = new JPanel();
	dolnyPanel = new JPanel();
	malyDolnyPanel = new JPanel();
    wczytanie1Panel = new JPanel();
    wczytanie2Panel = new JPanel();
    wynik1Panel = new JPanel();
    wynik2Panel = new JPanel();
    
    wczytanie1Label = new JLabel();
    wczytanie2Label = new JLabel();
    wynik1Label = new JLabel();
    wynik2Label = new JLabel();
    
    wczytanieComboBox = new JComboBox();
    
	krokButton = new JButton();
    startButton = new JButton();       
    
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ramka.setLayout(new BorderLayout());
    ramka.setTitle("BAM");
    
    gornyPanel.setBackground(new Color(240,230,212));
    gornyPanel.setPreferredSize(new Dimension(600,130));
    
    dolnyPanel.setBackground(new Color(227,214,187));
    dolnyPanel.setPreferredSize(new Dimension(600,130));
    
    malyDolnyPanel.setLayout(new BorderLayout());
    malyDolnyPanel.setBackground(new Color(227,214,187));
    
    wczytanie1Panel.setLayout(new BorderLayout());
    wczytanie1Panel.setBackground(new Color(255,255,255));
    wczytanie1Panel.setPreferredSize(new Dimension(120,120));
    
    wczytanie2Panel.setLayout(new BorderLayout());
    wczytanie2Panel.setBackground(new Color(255,255,255));
    wczytanie2Panel.setPreferredSize(new Dimension(120,80));    
    
    wynik1Panel.setLayout(new BorderLayout());
    wynik1Panel.setBackground(new Color(255,255,255));
    wynik1Panel.setPreferredSize(new Dimension(120,120));
    
    wynik2Panel.setLayout(new BorderLayout());
    wynik2Panel.setBackground(new Color(255,255,255));
    wynik2Panel.setPreferredSize(new Dimension(120,80));
    
    wczytanie1Label.setText("Wczytany obraz");        
    wczytanie2Label.setText("Odpowiadający obraz");
    wynik1Label.setText("Wczytany obraz");        
    wynik2Label.setText("Odpowiadający obraz");
    
    wczytanieComboBox.setBackground(new Color(224, 187, 111));
    wczytanieComboBox.setModel(new DefaultComboBoxModel(new String[] { "Wybierz", "1 zestaw", "2 zestaw", "3 zestaw", "4 zestaw", "5 zestaw" }));
    wczytanieComboBox.setPreferredSize(new Dimension(80, 25));
    wczytanieComboBox.addActionListener(new ActionListener() {
    	public void actionPerformed(ActionEvent evt) {
    		wczytanieComboboxActionPerformed(evt);
    	}
    });
    
    krokButton.setBackground(new Color(224, 187, 111));
    krokButton.setText("KROK");
    krokButton.setPreferredSize(new Dimension(80, 25));
    krokButton.addActionListener(new ActionListener() {
    	public void actionPerformed(ActionEvent evt) {
    		krokButtonActionPerformed(evt);
    	}
    });
    
    startButton.setBackground(new Color(224, 187, 111));
    startButton.setText("START");
    startButton.setPreferredSize(new Dimension(80, 25));   
    startButton.addActionListener(new ActionListener() {
    	public void actionPerformed(ActionEvent evt) {
    		startButtonActionPerformed(evt);
    	}
    });
    
    gornyPanel.add(wczytanie1Label);
    gornyPanel.add(wczytanie1Panel);
    gornyPanel.add(wczytanie2Label);
    gornyPanel.add(wczytanie2Panel);
    gornyPanel.add(wczytanieComboBox);
    
    malyDolnyPanel.add(startButton, BorderLayout.NORTH);
    malyDolnyPanel.add(krokButton, BorderLayout.SOUTH);
    
    dolnyPanel.add(wynik1Label);
    dolnyPanel.add(wynik1Panel);
    dolnyPanel.add(wynik2Label);
    dolnyPanel.add(wynik2Panel);
    dolnyPanel.add(malyDolnyPanel);
    
    ramka.add(gornyPanel, BorderLayout.NORTH);
    ramka.add(dolnyPanel, BorderLayout.CENTER);
    
    ramka.pack();
    ramka.setVisible(true);
}

public BAM() {
	initComponents();
}

public static void main(String[] args) {
	java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new BAM();
        }
    });
} 

}

0
  1. Konstrukory:
//ustawiasz ilosc kratek w poziomie i w pionie x,y
public BamDraw(int x, int y) 
//to co powyzej + rozmiar kratki
public BamDraw(int pixelSize,int x,int y) 
//to co wyżej + kolor wypelnienia, kolor planszy i kolor lini
public BamDraw(int pixelSize, int x,int y, Color filledCol, Color defaultCol, Color lineCol) 
  1. Wypełniam fałszami bo jest to wartośc początkowa, czysta plansza

  2. Ogólnie nie wiem na czym polega ten algorytm który próbujesz zaimplementować, dałem jedynie narzędzie do rysowania tych macierzy.

Ogólnie to zamiast :

private JPanel wczytanie1Panel;
    private JPanel wczytanie2Panel;
    private JPanel wynik1Panel;
    private JPanel wynik2Panel;

daj tą klase BamDraw:

 import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.*;
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class BAM extends JFrame {

        private JFrame ramka;

        private JPanel gornyPanel;
        private JPanel dolnyPanel;
        private JPanel malyDolnyPanel;
    private BamDraw wczytanie1Panel;
    private BamDraw wczytanie2Panel;
    private BamDraw wynik1Panel;
    private BamDraw wynik2Panel;

    private JLabel wczytanie1Label;
    private JLabel wczytanie2Label;
    private JLabel wynik1Label;
    private JLabel wynik2Label;

    private JComboBox wczytanieComboBox;

        private JButton krokButton;
    private JButton startButton;

    Image a1 = Toolkit.getDefaultToolkit().getImage("1a.jpg");
    String rysunek[] = new String[64];

    private void wczytanieComboboxActionPerformed(ActionEvent evt) {
            int opcja = wczytanieComboBox.getSelectedIndex();

                switch(opcja) {
                case 0:

                        break;
                case 1:

                        break;
                case 2:

                            break;
                case 3:

                            break;
                case 4:

                            break;
                case 5:

                            break;
                }
    }

    private void krokButtonActionPerformed(ActionEvent evt) {

    }

    private void startButtonActionPerformed(ActionEvent evt) {

    }

    public void initComponents() {
            ramka = new JFrame();

            gornyPanel = new JPanel();
            dolnyPanel = new JPanel();
            malyDolnyPanel = new JPanel();
        wczytanie1Panel = new BamDraw(10,10,10);
        wczytanie2Panel = new BamDraw(10,10,10);
        wynik1Panel = new BamDraw(10,10,10);
        wynik2Panel = new BamDraw(10,10,10);

        wczytanie1Label = new JLabel();
        wczytanie2Label = new JLabel();
        wynik1Label = new JLabel();
        wynik2Label = new JLabel();

        wczytanieComboBox = new JComboBox();

            krokButton = new JButton();
        startButton = new JButton();

        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.setLayout(new BorderLayout());
        ramka.setTitle("BAM");

        gornyPanel.setBackground(new Color(240,230,212));
        gornyPanel.setPreferredSize(new Dimension(600,130));

        dolnyPanel.setBackground(new Color(227,214,187));
        dolnyPanel.setPreferredSize(new Dimension(600,130));

        malyDolnyPanel.setLayout(new BorderLayout());
        malyDolnyPanel.setBackground(new Color(227,214,187));

        wczytanie1Panel.setLayout(new BorderLayout());
        wczytanie1Panel.setBackground(new Color(255,255,255));

        wczytanie2Panel.setLayout(new BorderLayout());
        wczytanie2Panel.setBackground(new Color(255,255,255));

        wynik1Panel.setLayout(new BorderLayout());
        wynik1Panel.setBackground(new Color(255,255,255));

        wynik2Panel.setLayout(new BorderLayout());
        wynik2Panel.setBackground(new Color(255,255,255));

        wczytanie1Label.setText("Wczytany obraz");
        wczytanie2Label.setText("Odpowiadający obraz");
        wynik1Label.setText("Wczytany obraz");
        wynik2Label.setText("Odpowiadający obraz");

        wczytanieComboBox.setBackground(new Color(224, 187, 111));
        wczytanieComboBox.setModel(new DefaultComboBoxModel(new String[] { "Wybierz", "1 zestaw", "2 zestaw", "3 zestaw", "4 zestaw", "5 zestaw" }));
        wczytanieComboBox.setPreferredSize(new Dimension(80, 25));
        wczytanieComboBox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                        wczytanieComboboxActionPerformed(evt);
                }
        });

        krokButton.setBackground(new Color(224, 187, 111));
        krokButton.setText("KROK");
        krokButton.setPreferredSize(new Dimension(80, 25));
        krokButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                        krokButtonActionPerformed(evt);
                }
        });

        startButton.setBackground(new Color(224, 187, 111));
        startButton.setText("START");
        startButton.setPreferredSize(new Dimension(80, 25));
        startButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                        startButtonActionPerformed(evt);
                }
        });

        gornyPanel.add(wczytanie1Label);
        gornyPanel.add(wczytanie1Panel);
        gornyPanel.add(wczytanie2Label);
        gornyPanel.add(wczytanie2Panel);
        gornyPanel.add(wczytanieComboBox);

        malyDolnyPanel.add(startButton, BorderLayout.NORTH);
        malyDolnyPanel.add(krokButton, BorderLayout.SOUTH);

        dolnyPanel.add(wynik1Label);
        dolnyPanel.add(wynik1Panel);
        dolnyPanel.add(wynik2Label);
        dolnyPanel.add(wynik2Panel);
        dolnyPanel.add(malyDolnyPanel);

        ramka.add(gornyPanel, BorderLayout.NORTH);
        ramka.add(dolnyPanel, BorderLayout.CENTER);

        ramka.pack();
        ramka.setVisible(true);
    }

        public BAM() {
                initComponents();
        }

        public static void main(String[] args) {
                java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new BAM();
            }
        });
        }
}

I sobie odpowiednio na ActionPerformed przycisków rysuj dane macierze

public void setMatrix(boolean[][] matrix)
0

Sam algorytm polega na przeksztalcaniu obrazku z jednego na drugi... i po prostu za pomoca JCombobox musze wczytac w czytanie1Panel oraz wczytanie2Panel dwa obrazki ktore stanowia zzestaw. Za pomoca krokButton albo startButton koljeno przeksztalcam albo krok po kroku, albo od razu caly.

I teraz chodzi mi o to aby samemu na podstawie tego rysunku co mam 6x6 pikseli zawartosciowac macierz kolorami czarne lub biale... ale nie wime jak to zrobic ... aby dla czarnego bylo 1 a dla bialego -1 .

0

Szczerze powiedziawszy nie rozumiem co chcesz zrobić :)
Ale może to coś pomoże:

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Dimension;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class BAM extends JFrame implements ActionListener, ItemListener{
	private final static int X_SIZE = 6;
	private final static int Y_SIZE = 6;
	private final static int PIXEL_SIZE = 20;

	private BamDraw wczyt1;
	private BamDraw wynik1;

	private BamDraw wczyt2;
	private BamDraw wynik2;

	private JComboBox select;
	private JButton start;
	private JButton step;

	private Object[][] wzory;


	public BAM() {
		super("Bam");
		this.setSize(400,315);
		this.setResizable(false);
		this.getContentPane().setLayout(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		initPatterns();
		initComponents();
		this.getContentPane().add(wczyt1);
		this.getContentPane().add(wczyt2);
		this.getContentPane().add(wynik1);
		this.getContentPane().add(wynik2);
		this.getContentPane().add(select);
		this.getContentPane().add(start);
		this.getContentPane().add(step);

		this.setVisible(true);
	}

	private void initPatterns() {
		wzory = new Object[2][2]; //2 wzory po 2

		boolean[][] a = {
			{false, false, false, false, false ,false},
			{false, true, true, true, true, true},
			{true, false, false, true, false, false},
			{true, false, false, true, false, false},
			{false ,true, true, true, true, true},
			{false ,false, false, false, false, false}
		};
		wzory[0][0] = a;

		//liczba 1
		boolean[][] one = {
			{false,false, false,false,false,false},
			{false, true,false,false,false,false},
			{true, true,false,false,false,false},
			{true, true,true,true,true,true},
			{false ,false,false,false,false,false},
			{false,false,false,false,false,false}
		};

		wzory[0][1] = one;

		//litera b
		boolean[][] b = {
			{false,false,false,false,false,false},
			{true,true,true,true,true,true},
			{true,false,true,false,false,true},
			{true,false,true,false,false,true},
			{false,true,false,true,true,false},
			{false,false,false,false,false,false},
		};
		wzory[1][0] = b;

		//liczba 2
		boolean[][] two = {
			{false,false,false,false,false,false},
			{false,true,false,false,true,true},
			{true,false,false,true,false,true},
			{true,false,true,false,false,true},
			{false,true,false,false,false,true},
			{false,false,false,false,false,false}
		};
		wzory[1][1] = two;
	}

	private void initComponents() {
		wczyt1 = new BamDraw(PIXEL_SIZE, X_SIZE, Y_SIZE, Color.BLACK, Color.WHITE, Color.BLACK);
		wczyt1.setBounds(5,5,wczyt1.getPreferredSize().width, wczyt1.getPreferredSize().height);

		wynik1 = new BamDraw(PIXEL_SIZE, X_SIZE, Y_SIZE, Color.RED, Color.WHITE, Color.BLACK);
		wynik1.setBounds(15+wczyt1.getPreferredSize().width,5,wynik1.getPreferredSize().width, wynik1.getPreferredSize().height);

		wczyt2 = new BamDraw(PIXEL_SIZE, X_SIZE, Y_SIZE, Color.BLACK, Color.WHITE, Color.BLACK);
		wczyt2.setBounds(5,30+wczyt1.getPreferredSize().height,wczyt2.getPreferredSize().width, wczyt2.getPreferredSize().height);

		wynik2 = new BamDraw(PIXEL_SIZE, X_SIZE, Y_SIZE, Color.RED, Color.WHITE, Color.BLACK);
		wynik2.setBounds(15+wczyt2.getPreferredSize().width,30+wczyt1.getPreferredSize().height,wynik2.getPreferredSize().width, wynik2.getPreferredSize().height);

		select = new JComboBox();
		select.setBackground(Color.WHITE);
		select.addItem("Wybierz");
		select.addItem("Wzrór1");
		select.addItem("Wzrór2");
		select.addItemListener(this);
		select.setBounds(30+wczyt1.getPreferredSize().width+wynik1.getPreferredSize().width, 30, 100, 25);

		start = new JButton("START");
		start.setActionCommand("start");
		start.addActionListener(this);
		start.setBounds(30+wczyt2.getPreferredSize().width+wynik2.getPreferredSize().width, 65+wczyt2.getPreferredSize().height, 100, 25);

		step = new JButton("KROK");
		step.setActionCommand("step");
		step.addActionListener(this);
		step.setBounds(30+wczyt2.getPreferredSize().width+wynik2.getPreferredSize().width, 95+wczyt2.getPreferredSize().height, 100, 25);
	}

	public static void main(String args[]) {
		new BAM();
	}

	//actionlistener
	public void actionPerformed(ActionEvent e) {

	}
	public void itemStateChanged(ItemEvent e) {
		if(e.getSource() == null) return;
		if(e.getSource().equals(select)) {
			if(select.getSelectedIndex() == 0) return;
			try {
				boolean[][] wczyt_matrix = (boolean[][])wzory[select.getSelectedIndex()-1][0];
				boolean[][] wynik_matrix = (boolean[][])wzory[select.getSelectedIndex()-1][1];
				wczyt1.setMatrix(wczyt_matrix);
				wynik1.setMatrix(wynik_matrix);
			}catch(IndexOutOfBoundsException ex) {
			}
		}
	}
}

class BamDraw extends JPanel {
	private int x; //ilosc kratek w poziomie
	private int y; //ilosc kratek w pionie

	private int pixelSize; //rozmiar kratki
	private Color filledCol; //kolor wypelnienia
	private Color defaultCol; //kolor planszy
	private Color lineCol; //kolor lini

	boolean [][] matrix; //macierz

	public BamDraw(int x, int y) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = 10;
		this.filledCol = Color.BLACK;
		this.defaultCol = Color.WHITE;
		this.lineCol = Color.BLACK;
		this.setOpaque(false);

		initMatrix();
	}

	public BamDraw(int pixelSize,int x,int y) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = pixelSize;
		this.filledCol = Color.BLACK;
		this.defaultCol = Color.WHITE;
		this.lineCol = Color.BLACK;
		this.setOpaque(false);

		initMatrix();
	}
	public BamDraw(int pixelSize, int x,int y, Color filledCol, Color defaultCol, Color lineCol) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = pixelSize;
		this.filledCol = filledCol;
		this.defaultCol = defaultCol;
		this.lineCol = lineCol;
		this.setOpaque(false);

		initMatrix();
	}

	private void initMatrix() {
		this.matrix = new boolean [x][y];
		for(int i=0; i<x; i++)
			for(int j=0; j<y; j++)
				matrix[i][j] = false;
	}
	public void setMatrix(boolean[][] matrix) {
		if(matrix == null) return;
		try {
			if(matrix.length != this.matrix.length || matrix[0].length != this.matrix[0].length) return ;
		}catch(NullPointerException e) {
			return ;
		}catch(IndexOutOfBoundsException e) {
			return ;
		}
		this.matrix = matrix;
		repaint();
		revalidate();
	}

	public Dimension getPreferredSize() {
		return new Dimension(x*pixelSize +(x+1), y*pixelSize+ (y +1)); //plus linie
	}

	private void paintMatrix(Graphics g) {
		g.setColor(defaultCol);
		g.fillRect(0, 0, getPreferredSize().width, getPreferredSize().height);
		drawGrid(g);

		for(int i=0; i<matrix.length; i++) {
			for(int j=0; j<matrix[0].length; j++) {
				if(matrix[i][j]) {
					g.setColor(filledCol);
				} else {
					g.setColor(defaultCol);
				}
				g.fillRect(pixelSize*i +(i+1), pixelSize*j+(j+1),pixelSize, pixelSize);
			}
		}
	}
	private void drawGrid(Graphics g) {
		g.setColor(lineCol);
		for(int i=0; i<=getPreferredSize().width; i+=pixelSize+1) {
			g.drawLine(i, 0, i, this.getPreferredSize().height);
		}
		for(int j=0; j<=getPreferredSize().height; j+=pixelSize+1) {
			g.drawLine(0, j, getPreferredSize().width, j);
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		paintMatrix(g);
	}
}
0

Wiesz, program olega na tym, tak jak pokazuje link z pytania. Musze wczytac pare rysunkow. Pozniej opierajac sie o siec BAm - sztuczna inteligencja, przetwarzac kolejno wczytane rysunki. Albo krok po kroku, albo po nacisnieciu START od razu. I dlatego pytalem o to jak zawartosciowac macierz pixelami z rysunku, albopo prostu jak wstawic odpowiednie wartosci do macierzy dla koloru bialego i czarnego, aby narysowal, to co chce :). A teraz zobacze Twoj kod :0

0

Generalnie to zrobiłem tylko prosty JPanel do rysowania graficznie gotowych wyników :)
Zrobiłem to w oparciu o macierz typu boolean, natomiast funkcja aktywacji perceptronu zwraca wartości 1 lub -1, ale możesz to łatwo przerobić.

0

Kod super ;]

I teraz po nacisnieciu KROK musi odbyc jedna iteracja, ktora spowoduje przeksztalcenie rysunku. i pewnie ta metoda bedzie mi teraz potrzebna do wstawiania tych przeksztalcanych kolejno rysunkow do dolnych paneli hm...

jacobus2k napisał(a)

public void actionPerformed(ActionEvent e) {

    }

I o co chodzi z ta funkcja ??

jacobus2k napisał(a)

natomiast funkcja aktywacji perceptronu zwraca wartości 1 lub -1, ale możesz to łatwo przerobić.

bo nie za bardzo wiem gdzie to jest w tym kodzie ?? :) Bo wlasnie 1 lub -1 sa mi potrzebne do zbudowania macierzy, ktora bede zmieniac te rysunki :)

I jak mozna rozumiec to *.setBounds?

jacobus2k napisał(a)

wynik2.setBounds(15+wczyt2.getPreferredSize().width,30+wczyt1.getPreferredSize().height,wynik2.getPreferredSize().width, wynik2.getPreferredSize().height);

</guote>

skad te 15 i 30 do sumy ???

0

Jeżeli chodzi o implementacja samej sieci neuronowej to nie bardzo mogę pomóc ;/ Natomiast prezentacja jest stosunkowo prosta.

Jak rozumiem, gotowe macierze litery A itd były by wynikami, które były by sprawdzane w czasie iteracji sieci BAM i jeśli nie zgadzały by się wyniki zmieniane były by wagi neuronów i na ich podstawie otrzymywalibyśmy nowe macierze, które były by prezentowane "na dole".

Teraz rzecz kolejna:
metoda:

public void actionPerformed(ActionEvent e) {
}

Przeciąża interfejs ActionListener. Klasa BAM którą zaprezentowałem implementuje go, a zatem do JButton'ów podpinam tą właśnie klase:

...
start = new JButton("START");
start.setActionCommand("start");
start.addActionListener(this); //w ten sposób
...

Teraz w momencie naciśnięcia zostanie wywołana metoda actionPerformed
Możesz to obłużyć np: tak:

public void actionPerformed(ActionEvent e) {
	if(e.getActionCommand().equals("start")) {
		//Dzialanie przycisku start
	}
}

Sądząc po twoim przykładzie, pracowałeś w C# troche, w Javie systuacja wygląda troche inaczej.

Sprawa druga:

setBounds(int,int,int,int)

Przypisuje danemu komponentowi pozycje x,y, szerokość i wysokość. Te liczby 30 itp. to zwykłe moje obliczonka.
A setBounds działą gdy dasz pusty menadżer rozmieszczenia setLayout(null).

Zmodyfikowałem klase BamDraw, tak że operuje na macierzach -1, 1:

class BamDraw extends JPanel {
	private int x; //ilosc kratek w poziomie
	private int y; //ilosc kratek w pionie

	private int pixelSize; //rozmiar kratki
	private Color filledCol; //kolor wypelnienia
	private Color defaultCol; //kolor planszy
	private Color lineCol; //kolor lini

	int [][] matrix; //macierz

	public BamDraw(int x, int y) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = 10;
		this.filledCol = Color.BLACK;
		this.defaultCol = Color.WHITE;
		this.lineCol = Color.BLACK;
		this.setOpaque(false);

		initMatrix();
	}

	public BamDraw(int pixelSize,int x,int y) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = pixelSize;
		this.filledCol = Color.BLACK;
		this.defaultCol = Color.WHITE;
		this.lineCol = Color.BLACK;
		this.setOpaque(false);

		initMatrix();
	}
	public BamDraw(int pixelSize, int x,int y, Color filledCol, Color defaultCol, Color lineCol) {
		super();
		this.x =x;
		this.y =y;
		this.pixelSize = pixelSize;
		this.filledCol = filledCol;
		this.defaultCol = defaultCol;
		this.lineCol = lineCol;
		this.setOpaque(false);

		initMatrix();
	}

	private void initMatrix() {
		this.matrix = new int [x][y];
		for(int i=0; i<x; i++)
			for(int j=0; j<y; j++)
				matrix[i][j] = -1;
	}
	public void setMatrix(int[][] matrix) {
		if(matrix == null) return;
		try {
			if(matrix.length != this.matrix.length || matrix[0].length != this.matrix[0].length) return ;
		}catch(NullPointerException e) {
			return ;
		}catch(IndexOutOfBoundsException e) {
			return ;
		}
		this.matrix = matrix;
		repaint();
		revalidate();
	}

	public Dimension getPreferredSize() {
		return new Dimension(x*pixelSize +(x+1), y*pixelSize+ (y +1)); //plus linie
	}

	private void paintMatrix(Graphics g) {
		g.setColor(defaultCol);
		g.fillRect(0, 0, getPreferredSize().width, getPreferredSize().height);
		drawGrid(g);

		for(int i=0; i<matrix.length; i++) {
			for(int j=0; j<matrix[0].length; j++) {
				if(matrix[i][j] == 1) {
					g.setColor(filledCol);
				} else {
					g.setColor(defaultCol);
				}
				g.fillRect(pixelSize*i +(i+1), pixelSize*j+(j+1),pixelSize, pixelSize);
			}
		}
	}
	private void drawGrid(Graphics g) {
		g.setColor(lineCol);
		for(int i=0; i<=getPreferredSize().width; i+=pixelSize+1) {
			g.drawLine(i, 0, i, this.getPreferredSize().height);
		}
		for(int j=0; j<=getPreferredSize().height; j+=pixelSize+1) {
			g.drawLine(0, j, getPreferredSize().width, j);
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		paintMatrix(g);
	}
}

I tak teraz wzór litery A zapisany w macierzy 6x6 wygląda tak:

...
int[][] a = {
		{-1, -1, -1, -1, -1 ,-1},
		{-1, 1, 1, 1, 1, 1},
		{1, -1, -1, 1, -1, -1},
		{1, -1, -1, 1, -1, -1},
		{-1 ,1, 1, 1, 1, 1},
		{-1 ,-1, -1, -1, -1, -1}
	};
...

Gdzie -1 oznaczy kolor defaultCol, a 1 kolor filledCol w klasie BamDraw czyli standardowo Biel i Czerń.

0

Wielkie dzieki :) Na razie popracuje nad zmianami :) Mysle, ze nie bedzie juz takie ciezkie narysowanie rysunkow lekko zmodyfikowanych po jednym KROKu

0
stachu84 napisał(a)

Wielkie dzieki :) Na razie popracuje nad zmianami :)

Hm... nie wiem dlaczego i nie za bardzo to rozumiem... w przypadku wczesniejszym jak mialem true/false to jak zamienilem sobie false na true, to kratka ktora byla zamalowana, terz juz byla czysta. Teraz, gdy sa 1 oraz -1 jedynki spowodowalo, ze zmiana, z 1 na -1 nie powoduje wyczyszcenia zawartosci kratki ??? i z drugiej strony, gdy juz raz nie zamaluje kratki, to on pozniej nie chce jej zamalowac rowniez hm... tak jakby on to cos pamietal :/

Hm... i w sumie przeciez ostatecznie mozna pozostac przy false/true. A macierz W ktora powstanie przez przemnozenie macierzy dla pierwszego rysunku, zmacierza dla drugiego rysunku, bedzie powstawac przez dodatkowy warunek, ze jezeli oba pola sa true, albo oba false, wtedy true, w przeciwnym wypadku false.

1 użytkowników online, w tym zalogowanych: 0, gości: 1