Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.BorderLayout;
- import java.awt.EventQueue;
- import javax.swing.*;
- import javax.swing.border.EmptyBorder;
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartPanel;
- import org.jfree.chart.JFreeChart;
- import org.jfree.data.xy.XYDataset;
- import org.jfree.data.xy.XYSeries;
- import org.jfree.data.xy.XYSeriesCollection;
- import java.awt.event.ActionListener;
- import java.awt.event.ActionEvent;
- import java.awt.TextArea;
- import java.awt.Button;
- import java.awt.Font;
- public class FuzzyWater extends JFrame {
- private static final long serialVersionUID = 1L;
- private JPanel contentPane;
- private JFrame levelWindow, rateWindow, valveWindow;
- private JTextField result;
- private double[][] level;
- private double[][] rate;
- private double[][] valve;
- private JLabel labelLevel;
- private JTextField levelValue;
- private JTextField inflowValue;
- private JComboBox slonce;
- private String [] slonceList = {"Jest", "Nie ma"};
- private Timer rolex;
- private TextArea textArea;
- private TextArea resArea;
- private JButton btn_calculate;
- public void createLevelTerm() {
- level = new double [4][31];
- System.out.println("Term 'level' ");
- for (int j=0; j<=20; j++)
- {
- double levelNegative = 0;
- double levelZero = 0;
- double levelPositive = 0;
- double x = ((double)(j-10));
- level[0][j] = x;
- //TERM NEGATIVE
- if (x>=(-18) && x<(-10)) {
- levelNegative = 1;
- }
- else if (x>=(-10) && x<=0) {
- levelNegative = ((0-(x))/(0-(-10)));
- }
- else {
- levelNegative = 0;
- }
- //TERM ZERO
- if (x>=-8 && x<=0){
- levelZero = (((x)-(-8))/(0-(-8)));
- }
- else if (x>0 && x<8) {
- levelZero = ((8-(x))/(8-0));
- }
- else {
- levelZero = 0;
- }
- //TERM POSITIVE
- if (x>0 && x<10) {
- levelPositive = (((x)-0)/(10-0));
- }
- else if (x>=10 && x<=18) {
- levelPositive = 1;
- }
- else {
- levelPositive = 0;
- }
- level [1][j] = levelNegative;
- level [2][j] = levelZero;
- level [3][j] = levelPositive;
- System.out.print(level[0][j] + " ");
- }
- }
- public void createRateTerm() {
- rate = new double [4][31];
- System.out.println("\nTerm 'rate' ");
- for (int j=0; j<=10; j++)
- {
- double rateNegative = 0;
- double rateZero = 0;
- double ratePositive = 0;
- double x = ((double)(j-5)/10);
- rate[0][j] = x;
- //TERM NEGATIVE
- if (x>=(-0.9) && x<(-0.5)) {
- rateNegative = 1;
- }
- else if (x>=(-0.5) && x<=0) {
- rateNegative = ((0-(x))/(0-(-0.5)));
- }
- else {
- rateNegative = 0;
- }
- //TERM ZERO
- if (x>=-0.4 && x<=0){
- rateZero = (((x)-(-0.4))/(0-(-0.4)));
- }
- else if (x>0 && x<0.4) {
- rateZero = ((0.4-(x))/(0.4-0));
- }
- else {
- rateZero = 0;
- }
- //TERM POSITIVE
- if (x>0 && x<0.5) {
- ratePositive = (((x)-0)/(0.5-0));
- }
- else if (x>=0.5 && x<=0.9) {
- ratePositive = 1;
- }
- else {
- ratePositive = 0;
- }
- rate [1][j] = rateNegative;
- rate [2][j] = rateZero;
- rate [3][j] = ratePositive;
- System.out.print(rate[0][j] + " ");
- }
- }
- public void createValveTerm() {
- valve = new double [4][31];
- System.out.println("\nTerm 'valve' ");
- for (int j=0; j<=10; j++)
- {
- double valveNegative = 0;
- double valveZero = 0;
- double valvePositive = 0;
- double x = ((double)(j-5));
- valve[0][j] = x;
- //TERM NEGATIVE
- if (x>=(-9) && x<(-5)) {
- valveNegative = 1;
- }
- else if (x>=(-5) && x<=0) {
- valveNegative = ((0-(x))/(0-(-5)));
- }
- else {
- valveNegative = 0;
- }
- //TERM ZERO
- if (x>=-4 && x<=0){
- valveZero = (((x)-(-4))/(0-(-4)));
- }
- else if (x>0 && x<4) {
- valveZero = ((4-(x))/(4-0));
- }
- else {
- valveZero = 0;
- }
- //TERM POSITIVE
- if (x>0 && x<5) {
- valvePositive = (((x)-0)/(5-0));
- }
- else if (x>=5 && x<=9) {
- valvePositive = 1;
- }
- else {
- valvePositive = 0;
- }
- valve [1][j] = valveNegative;
- valve [2][j] = valveZero;
- valve [3][j] = valvePositive;
- System.out.print(valve[0][j] + " ");
- }
- }
- private XYDataset createLevelDataset()
- {
- XYSeriesCollection datasetLevel = new XYSeriesCollection();
- XYSeries levelTermNegative = new XYSeries("Negative");
- XYSeries levelTermZero = new XYSeries("Empty");
- XYSeries levelTermPositive = new XYSeries("Full");
- for (int i = 0; i <=20; i++)
- {
- levelTermNegative.add(level[0][i],level[1][i]);
- levelTermZero.add(level[0][i],level[2][i]);
- levelTermPositive.add(level[0][i],level[3][i]);
- }
- datasetLevel.addSeries(levelTermNegative);
- datasetLevel.addSeries(levelTermZero);
- datasetLevel.addSeries(levelTermPositive);
- return datasetLevel;
- }
- private XYDataset createRateDataset()
- {
- XYSeriesCollection datasetRate = new XYSeriesCollection();
- XYSeries rateTermNegative = new XYSeries("Negative");
- XYSeries rateTermZero = new XYSeries("Zero");
- XYSeries rateTermPositive = new XYSeries("Positive");
- for (int i = 0; i <=10; i++)
- {
- rateTermNegative.add(rate[0][i],rate[1][i]);
- rateTermZero.add(rate[0][i],rate[2][i]);
- rateTermPositive.add(rate[0][i],rate[3][i]);
- }
- datasetRate.addSeries(rateTermNegative);
- datasetRate.addSeries(rateTermZero);
- datasetRate.addSeries(rateTermPositive);
- return datasetRate;
- }
- private XYDataset createValveDataset()
- {
- XYSeriesCollection datasetValve = new XYSeriesCollection();
- XYSeries valveTermNegative = new XYSeries("Negative");
- XYSeries valveTermZero = new XYSeries("Zero");
- XYSeries valveTermPositive = new XYSeries("Positive");
- for (int i = 0; i <=10; i++)
- {
- valveTermNegative.add(valve[0][i],valve[1][i]);
- valveTermZero.add(valve[0][i],valve[2][i]);
- valveTermPositive.add(valve[0][i],valve[3][i]);
- }
- datasetValve.addSeries(valveTermNegative);
- datasetValve.addSeries(valveTermZero);
- datasetValve.addSeries(valveTermPositive);
- return datasetValve;
- }
- private JPanel createLevelChartPanel()
- {
- String chartTitleLevel = "Level";
- String xAxisLabelLevel = "Level";
- String yAxisLabelLevel = "μ(Level)";
- XYDataset datasetLevel = createLevelDataset();
- JFreeChart chartLevel = ChartFactory.createXYLineChart(chartTitleLevel, xAxisLabelLevel, yAxisLabelLevel, datasetLevel);
- return new ChartPanel(chartLevel);
- }
- private JPanel createRateChartPanel()
- {
- String chartTitleRate = "Rate";
- String xAxisLabelRate = "Rate";
- String yAxisLabelRate = "μ(Rate)";
- XYDataset datasetRate = createRateDataset();
- JFreeChart chartRate = ChartFactory.createXYLineChart(chartTitleRate, xAxisLabelRate, yAxisLabelRate, datasetRate);
- return new ChartPanel(chartRate);
- }
- private JPanel createValveChartPanel()
- {
- String chartTitleValve = "Valve";
- String xAxisLabelValve = "Valve";
- String yAxisLabelValve = "μ(Valve)";
- XYDataset datasetValve = createValveDataset();
- JFreeChart chartValve = ChartFactory.createXYLineChart(chartTitleValve, xAxisLabelValve, yAxisLabelValve, datasetValve);
- return new ChartPanel(chartValve);
- }
- public void createRules() {
- rolex = new Timer(1000, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e)
- {
- Object o = e.getSource();
- double checkLevel, checkInflow;
- if (levelValue.getText().equals("")) {
- JOptionPane.showMessageDialog(null, "Pole Stan Zbiornika nie może być puste.");
- return;
- }
- if (isDouble(levelValue.getText())) {
- checkLevel = Double.parseDouble(levelValue.getText());
- } else {
- JOptionPane.showMessageDialog(null, "Proszę wprowadzić wartość numeryczną.");
- return;
- }
- // Sprawdzenie czy pole tekstowe Przyplyw Wody jest puste oraz czy zostala wpisana liczba.
- if (inflowValue.getText().equals("")) {
- JOptionPane.showMessageDialog(null, "Pole Przypływ Wody nie może być puste.");
- return;
- }
- if (isDouble(inflowValue.getText())) {
- checkInflow = Double.parseDouble(inflowValue.getText());
- } else {
- JOptionPane.showMessageDialog(null, "Proszę wprowadzić wartość numeryczną.");
- return;
- }
- if ((checkLevel >= -10) && (checkLevel <= 10)) {
- if ((checkInflow >= -0.5) && (checkInflow <= 0.5)) {
- }
- else {
- JOptionPane.showMessageDialog(null, "Proszę podać wartość w przedziale od -0.5 do 0.5.");
- return;
- }
- } else {
- JOptionPane.showMessageDialog(null, "Proszę podać wartość w przedziale od -10 do 10.");
- return;
- }
- // ROZMYCIE LEVEL
- double R1LevelRozmycie = 0;
- double R2LevelRozmycie = 0;
- double R3LevelRozmycie = 0;
- String levelText = levelValue.getText();
- Double dlevelValue = Double.parseDouble(levelText);
- for(int i=0; i<=20; i++)
- {
- if (level[0][i] == dlevelValue) {
- R1LevelRozmycie = level[1][i];
- R2LevelRozmycie = level[2][i];
- R3LevelRozmycie = level[3][i];
- }
- }
- // ROZMYCIE NAPŁYW
- double R1RateRozmycie = 0;
- double R2RateRozmycie = 0;
- double R3RateRozmycie = 0;
- String inflowText = inflowValue.getText();
- Double dinflowValue = Double.parseDouble(inflowText);
- for(int i=0; i<=10; i++)
- {
- if (rate[0][i] == dinflowValue) {
- R1RateRozmycie = rate[1][i];
- R2RateRozmycie = rate[2][i];
- R3RateRozmycie = rate[3][i];
- }
- }
- //REGUŁY OGÓLNE
- double R1min = Math.min(R1LevelRozmycie, R1RateRozmycie);
- double R2min = Math.min(R1LevelRozmycie, R2RateRozmycie);
- double R3min = Math.min(R1LevelRozmycie, R3RateRozmycie);
- double R4min = Math.min(R2LevelRozmycie, R1RateRozmycie);
- double R5min = Math.min(R2LevelRozmycie, R2RateRozmycie);
- double R6min = Math.min(R2LevelRozmycie, R3RateRozmycie);
- double R7min = Math.min(R3LevelRozmycie, R1RateRozmycie);
- double R8min = Math.min(R3LevelRozmycie, R2RateRozmycie);
- double R9min = Math.min(R3LevelRozmycie, R3RateRozmycie);
- double [][] RLnegRRneg = new double [2][31];
- double [][] RLnegRRzer = new double [2][31];
- double [][] RLnegRRpos = new double [2][31];
- double [][] RLzerRRneg = new double [2][31];
- double [][] RLzerRRzer = new double [2][31];
- double [][] RLzerRRpos = new double [2][31];
- double [][] RLposRRneg = new double [2][31];
- double [][] RLposRRzer = new double [2][31];
- double [][] RLposRRpos = new double [2][31];
- double [][] R1R2Max = new double [2][31];
- double [][] R3R4Max = new double [2][31];
- double [][] R5R6Max = new double [2][31];
- double [][] R7R8Max = new double [2][31];
- double [][] R12R34Max = new double [2][31];
- double [][] R56R78Max = new double [2][31];
- double [][] R1234R5678Max = new double [2][31];
- double [][] R9Max = new double [2][31]; //KOŃCOWE MAKSIMUM
- double licznikValve = 0;
- double mianownikValve = 0;
- double metodaResult = 0;
- for(int i=0; i<=10; i++)
- {
- //OD 1 DO 9 TO CO NA KARTCE (LICZENIE MINIMUM)
- double x = ((double)(i-5));
- RLnegRRneg[0][i] = x;
- RLnegRRneg[1][i] = Math.min(R1min, valve[1][i]);
- RLnegRRzer[0][i] = x;
- RLnegRRzer[1][i] = Math.min(R2min, valve[1][i]);
- RLnegRRpos[0][i] = x;
- RLnegRRpos[1][i] = Math.min(R3min, valve[1][i]);
- RLzerRRneg[0][i] = x;
- RLzerRRneg[1][i] = Math.min(R4min, valve[1][i]);
- RLzerRRzer[0][i] = x;
- RLzerRRzer[1][i] = Math.min(R5min, valve[2][i]);
- RLzerRRpos[0][i] = x;
- RLzerRRpos[1][i] = Math.min(R6min, valve[3][i]);
- RLposRRneg[0][i] = x;
- RLposRRneg[1][i] = Math.min(R7min, valve[3][i]);
- RLposRRzer[0][i] = x;
- RLposRRzer[1][i] = Math.min(R8min, valve[3][i]);
- RLposRRpos[0][i] = x;
- RLposRRpos[1][i] = Math.min(R9min, valve[3][i]);
- //MAKSIMUM WARTOSCI OD 1 DO 9
- R1R2Max[0][i] = x;
- R1R2Max[1][i] = Math.max(RLnegRRneg[1][i], RLnegRRzer[1][i]);
- R3R4Max[0][i] = x;
- R3R4Max[1][i] = Math.max(RLnegRRpos[1][i], RLzerRRneg[1][i]);
- R5R6Max[0][i] = x;
- R5R6Max[1][i] = Math.max(RLzerRRzer[1][i], RLzerRRpos[1][i]);
- R7R8Max[0][i] = x;
- R7R8Max[1][i] = Math.max(RLposRRneg[1][i], RLposRRzer[1][i]);
- R12R34Max[0][i] = x;
- R12R34Max[1][i] = Math.max(R1R2Max[1][i], R3R4Max[1][i]);
- R56R78Max[0][i] = x;
- R56R78Max[1][i] = Math.max(R5R6Max[1][i], R7R8Max[1][i]);
- R1234R5678Max[0][i] = x;
- R1234R5678Max[1][i] = Math.max(R12R34Max[1][i], R56R78Max[1][i]);
- R9Max[0][i] = x;
- R9Max[1][i] = Math.max(R1234R5678Max[1][i], RLposRRpos[1][i]);
- //METODA ŚRODKA CIĘŻKOŚCI
- licznikValve += (R9Max[0][i]*R9Max[1][i]);
- mianownikValve += R9Max[1][i];
- metodaResult = (licznikValve/mianownikValve);
- textArea.append("NEGATIVE: " + Double.toString(valve[1][i])
- + "\n" + "ZERO: " + Double.toString(valve[2][i])
- + "\n" + "POSITIVE: " + Double.toString(valve[3][i])
- + "\n" + "======================== \n");
- }
- System.out.println("\nLicznik: "+ licznikValve);
- System.out.println("Mianownik: "+mianownikValve);
- System.out.println("Metoda środka ciężkości: "+metodaResult);
- resArea.append("\nLicznik: "+ Double.toString(licznikValve));
- resArea.append("Mianownik: "+ Double.toString(mianownikValve));
- resArea.append("Metoda środka ciężkości: "+ Double.toString(metodaResult));
- result.setText(Double.toString(metodaResult));
- //rośnięcie post mielone xD
- if(dlevelValue<10 && !inflowValue.equals("0")) {
- //poziom rośnie o 1
- if (dinflowValue < 0 && dlevelValue<=9) {
- dlevelValue = dlevelValue + 1;
- levelValue.setText(String.valueOf(dlevelValue));
- //poziom rośnie o 2
- }
- if (dinflowValue > 0 && dlevelValue <=8) {
- dlevelValue = dlevelValue + 2;
- levelValue.setText(String.valueOf(dlevelValue));
- }
- if (dlevelValue==10) {
- inflowValue.setText("0");
- }
- }
- if(dlevelValue<=10 && Double.parseDouble(inflowValue.getText())==0)
- {
- if(slonce.getSelectedItem().equals("Jest"))
- {
- dlevelValue=dlevelValue-2;
- levelValue.setText(String.valueOf(dlevelValue));
- }
- else if(slonce.getSelectedItem().equals("Nie ma"))
- {
- dlevelValue=dlevelValue-1;
- levelValue.setText(String.valueOf(dlevelValue));
- }
- if (dlevelValue == -10 && Double.parseDouble(inflowValue.getText())==0)
- {
- rolex.stop();
- }
- }
- if (o == btn_calculate) {
- String tekst = levelValue.getText();
- double liczba = Double.parseDouble(tekst);
- //for(int i=0; i<=20; i++) {
- // if (valve[0][i] == liczba) {
- // int licznik = i;
- // textArea.setText("NEGATIVE: " + Double.toString(valve[1][licznik])
- // + "\n" + "ZERO: " + Double.toString(valve[2][licznik])
- // + "\n" + "POSITIVE: " + Double.toString(valve[3][licznik]));
- // }
- // }
- }
- }
- });
- rolex.start();
- }
- public FuzzyWater() {
- //Term LEVEL
- createLevelTerm();
- createLevelChartPanel();
- createLevelDataset();
- //Term RATE
- createRateTerm();
- createRateChartPanel();
- createRateDataset();
- //Term VALVE
- createValveTerm();
- createValveChartPanel();
- createValveDataset();
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setSize(620, 470);
- setLocationRelativeTo(null);
- JMenuBar menuBar = new JMenuBar();
- setJMenuBar(menuBar);
- JMenu menuWykres = new JMenu("Wykres");
- JMenuItem itemLevel = new JMenuItem("Term \"Level\"");
- itemLevel.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent arg0) {
- levelWindow.setVisible(true);
- }
- });
- JMenuItem itemRate = new JMenuItem("Term \"Rate\"");
- itemRate.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent arg0) {
- rateWindow.setVisible(true);
- }
- });
- JMenuItem itemValve = new JMenuItem("Term \"Valve\"");
- itemValve.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent arg0) {
- valveWindow.setVisible(true);
- }
- });
- menuWykres.add(itemLevel);
- menuBar.add(menuWykres);
- menuWykres.add(itemRate);
- menuWykres.add(itemValve);
- contentPane = new JPanel();
- contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
- setContentPane(contentPane);
- contentPane.setLayout(null);
- result = new JTextField();
- result.setBounds(262, 212, 151, 20);
- contentPane.add(result);
- result.setColumns(10);
- TextArea resArea = new TextArea();
- resArea.setEditable(false);
- resArea.setBounds(394, 70, 161, 78);
- contentPane.add(resArea);
- textArea = new TextArea();
- textArea.setEditable(false);
- textArea.setBounds(10, 238, 584, 160);
- contentPane.add(textArea);
- slonce = new JComboBox(slonceList);
- slonce.setBounds(10,179,100,20);
- contentPane.add(slonce);
- btn_calculate = new JButton("Oblicz");
- btn_calculate.setBounds(216, 178, 151, 23);
- contentPane.add(btn_calculate);
- btn_calculate.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- createRules();
- }
- });
- labelLevel = new JLabel("Stan zbiornika:");
- labelLevel.setBounds(10, 12, 87, 14);
- contentPane.add(labelLevel);
- JLabel labelCiezkosc = new JLabel("Wynik środka ciężkości");
- labelCiezkosc.setBounds(94, 215, 151, 14);
- contentPane.add(labelCiezkosc);
- JLabel labelRate = new JLabel("Przypływ wody:");
- labelRate.setBounds(394, 12, 109, 14);
- contentPane.add(labelRate);
- levelValue = new JTextField();
- levelValue.setBounds(37, 37, 151, 20);
- contentPane.add(levelValue);
- levelValue.setColumns(10);
- JLabel lblWartociOd = new JLabel("Wartości od -10 do 10");
- lblWartociOd.setBounds(37, 68, 130, 14);
- contentPane.add(lblWartociOd);
- inflowValue = new JTextField();
- inflowValue.setColumns(10);
- inflowValue.setBounds(404, 38, 151, 20);
- contentPane.add(inflowValue);
- JLabel lblSoce = new JLabel("Słońce:");
- lblSoce.setBounds(10, 164, 46, 14);
- contentPane.add(lblSoce);
- JProgressBar progressBar = new JProgressBar();
- progressBar.setOrientation(SwingConstants.VERTICAL);
- progressBar.setBounds(10, 37, 17, 104);
- contentPane.add(progressBar);
- levelWindow = new JFrame("Term LEVEL");
- levelWindow.setSize(600,500);
- levelWindow.setLocationRelativeTo(null);
- levelWindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
- JPanel chartLevelPanel = createLevelChartPanel();
- levelWindow.getContentPane().add(chartLevelPanel);
- rateWindow = new JFrame("Term RATE");
- rateWindow.setSize(600,500);
- rateWindow.setLocationRelativeTo(null);
- rateWindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
- JPanel chartRatePanel = createRateChartPanel();
- rateWindow.getContentPane().add(chartRatePanel);
- valveWindow = new JFrame("Term VALVE");
- valveWindow.setSize(600,500);
- valveWindow.setLocationRelativeTo(null);
- valveWindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
- JPanel chartValvePanel = createValveChartPanel();
- valveWindow.getContentPane().add(chartValvePanel);
- }
- private static boolean isDouble(String m) {
- try {
- Double.parseDouble(m);
- return true;
- }
- catch (NumberFormatException e) {
- return false;
- }
- }
- public static void main(String[] args) {
- FuzzyWater frame = new FuzzyWater();
- frame.setVisible(true);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement