Rysowanie wykresu...

0

Pisze program wykreslajacy granice pomiedzy dwa grupami punktow, podstawie zadanych wspolrzednycyh puntkow, ktore powstaja przez klikniecie mysza w JPanel.

Na podstaiwe tych punktow i dodatkowych wag obliczam wagi[0] oraz wagi[1] bedace wagami oraz wagi[2] czyli teta.
nastepnie mam ze

int x1 = 0;
int y1 = wagi[2] - ((wagi[0]*x1)/wagi[1]);
int x2 = 1000;
int y2 = wagi[2] - ((wagi[0]*x2)/wagi[1]);

i czasami wartosci obliczone y1,y2 sa tak duze ze g.drawLine(x1,y1,x2,y2); nie daje wyniku na JPanel, chociaz powinien :/

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 Perceptron extends JFrame {

private JFrame ramka;
private JPanel gornyPanel;
private JPanel dolnyPanel;
private JButton startButton;
private JComboBox jComboBox;

int wagi[] = new int[] {0, 0, 0, 0};
int punkty[][] = new int [4][100];
int i = 0;
int rodzaj = 1;

private void startButtonActionPerformed(ActionEvent evt) {
	Random random = new Random();
	int ilosc_sklasyfikowanych = i;
	int numer;
	for(int j = 0; j < i; j++) {
		punkty[3][j] = 0;
	}
	
	while(ilosc_sklasyfikowanych > 0) {
		numer = random.nextInt(i);
		while (punkty[3][numer] != 0) {
			numer = random.nextInt(i);
//			System.out.println(numer + " numer");
		}			
		if ((wagi[0]*punkty[0][numer] + wagi[1]*punkty[1][numer]) > wagi[2]) {
			wagi[3] = 1;
		}
		else {
			wagi[3] = -1;
		}
		if (wagi[3] == punkty[2][numer]) {
			punkty[3][numer] = 1;
			ilosc_sklasyfikowanych--;
		}
		else {
			wagi[0] = wagi[0] + punkty[0][numer]*punkty[2][numer];
			wagi[1] = wagi[1] + punkty[1][numer]*punkty[2][numer];
			wagi[2] = wagi[2] - punkty[2][numer];
			
//			System.out.println(wagi[0] + " waga1");
//			System.out.println(wagi[1] + " waga2");
//			System.out.println(wagi[2] + " teta");
			
			for(int j = 0; j < i; j++) {
				punkty[3][j] = 0;
			}
			numer = random.nextInt(i);
			ilosc_sklasyfikowanych = i;
		}
	}

	System.out.println(wagi[0] + " waga1");
	System.out.println(wagi[1] + " waga2");
//	System.out.println(wagi[2] + " teta");
	
	int x1 = 0;
	int y1 = wagi[2] - ((wagi[0]*x1)/wagi[1]);
	int x2 = 1000;
	int y2 = wagi[2] - ((wagi[0]*x2)/wagi[1]);
	
	System.out.println(y1 + " y1");
	System.out.println(y2 + " y2");
	
	Graphics l = gornyPanel.getGraphics();
	l.setColor(Color.GREEN);
	l.drawLine(x1, y1, x2, y2);
	
//	l.setColor(Color.RED);
//	l.drawOval(x1,y1,2,2);
//	l.drawOval(x2,y2,2,2);
//	l.drawLine(-5,50,100,-100);
}

private void rodzajjComboboxActionPerformed(ActionEvent evt) {
	int option = jComboBox.getSelectedIndex();
	switch(option) {
    	case 0: rodzaj = 1;
            	break;
    	case 1: rodzaj = -1;
            	break;
	}
}	

private void gornyPanelmouseClicked(MouseEvent e) {
	
	punkty[0][i] = e.getX();
	punkty[1][i] = e.getY();
	punkty[2][i] = rodzaj;
	punkty[3][i] = 0;		
	
	Graphics g = gornyPanel.getGraphics();
	if (rodzaj == 1) {
		g.setColor(Color.RED);
	}
	else {
		g.setColor(Color.BLUE);
	}
	
	g.fillOval(punkty[0][i], punkty[1][i], 10, 10);

//	System.out.println(punkty[0][i]);
//	System.out.println(punkty[1][i]);
//	System.out.println(punkty[2][i]);
	
	i++;
}	
	
public Perceptron() {
	initComponents();
}

public void initComponents() {
	ramka = new JFrame();
	gornyPanel = new JPanel();
    dolnyPanel = new JPanel();
    startButton = new JButton();
    jComboBox = new JComboBox();
    
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    
    gornyPanel.setLayout(new BorderLayout());
    gornyPanel.setBackground(new Color(222, 207, 177));
    gornyPanel.setPreferredSize(new Dimension(555, 404));      
    
    gornyPanel.addMouseListener(new MouseListener() {
    	public void mousePressed(MouseEvent e) {
        }
        
        public void mouseReleased(MouseEvent e) {
        }
        
        public void mouseEntered(MouseEvent e) {
        }
        
        public void mouseExited(MouseEvent e) {
        }
        
    	public void mouseClicked(MouseEvent e) {
    		gornyPanelmouseClicked(e);
    	}
    });
    
    dolnyPanel.setLayout(new FlowLayout());
    dolnyPanel.setBackground(new Color(240, 230, 212));
    
    startButton.setBackground(new Color(201,168,102));
    startButton.setText("START");
    startButton.addActionListener(new ActionListener() {
    	public void actionPerformed(ActionEvent evt) {
    		startButtonActionPerformed(evt);
    	}
    });
    dolnyPanel.add(startButton);
    
    jComboBox.setBackground(new Color(240, 230, 212));
    jComboBox.setModel(new DefaultComboBoxModel(new String[] { "C", "N" }));
    jComboBox.addActionListener(new ActionListener() {
    	public void actionPerformed(ActionEvent evt) {
    		rodzajjComboboxActionPerformed(evt);
    	}
    });
    dolnyPanel.add(jComboBox);       
    
    ramka.add(gornyPanel, BorderLayout.NORTH);
    ramka.add(dolnyPanel, BorderLayout.SOUTH);
    
    ramka.pack();
    ramka.setVisible(true);
}

public static void main(String[] args) {
//	System.out.println("Maciej");
	java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Perceptron();
        }
    });
}	

}

0
stachu84 napisał(a)

int x1 = 0;
int y1 = wagi[2] - ((wagi[0]*x1)/wagi[1]);
int x2 = 1000;
int y2 = wagi[2] - ((wagi[0]*x2)/wagi[1]);

Znalazlem blad, powyzszy wzor winine wygladac tak:

            int x1 = 0;
	int y1 = wagi[2]/wagi[1] - ((wagi[0]*x1)/wagi[1]);
	int x2 = 1000;
	int y2 = wagi[2]/wagi[1] - ((wagi[0]*x2)/wagi[1]);

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