package int_test;

import java.text.DecimalFormat;
import java.util.Vector;
import javax.swing.JProgressBar;
import javax.swing.JEditorPane;
 
public class Silnik_regula_falsi extends Thread {
 public JEditorPane log;
 public JEditorPane wyniki;
 
 public String rownanie;
 public double gora;
 public double dol;
 public int kroki_ile;
 public double EPSX;
 
 public JProgressBar progres;
 public javax.swing.JPanel panel;     // glowny panel strony enable/disable
 private String historia_buf="";      // dziennik
 private String wyniki_buf="";        // wyniki

 public Vector<String> his_v;
 public Vector<String> wyn_v;

public synchronized void run() {
    this.progres.setVisible(true);
    this.panel.setEnabled(false);
    
    String kolor="";
    int step=0;
    DecimalFormat df = new DecimalFormat("#,###.#########");
    
    String bufor = "";
    bufor ="<table class='metoda' cellpadding='0' cellspacing='0' >";
    bufor+="<tr><td colspan='2' class='tyt2' >METODA REGULA FALSI </td></tr>";
    bufor+="<tr><td class='rownanie' > f(x)="+this.rownanie+" </td>";
    bufor+="<td class='przedzial' >Przedział od <b> " + this.dol + "</b> do <b>" + this.gora + "</b>, kroki <b>"+this.kroki_ile+"</b> </td></tr>";
    bufor+="</table>";

    wyniki_buf="";
    historia_buf="";
 
    boolean finish = true;
    double a = this.dol;
    double fa = statyczne_metody.licz_rownanie(this.rownanie, a);

    double b = this.gora;
    double fb = statyczne_metody.licz_rownanie(this.rownanie, b);
 
    if (fa * fb > 0.0D) {
      historia_buf="<tr ><td colspan='2' class='wynik' ><b>- funkcja nie spełnia założen!</b></td></tr>";
      finish = false;
      }

    int lic = this.kroki_ile;
    double x1 = a; 
    double x0 = b;

    while ((lic > 0) && (Math.abs(x1 - x0) > this.EPSX)) {
       step++;
       x1 = x0;
       x0=a-fa/(fb-fa)*(b-a); //miejsce zerowe prostej
       //x0 = (a * fb - b * fa) / (fb - fa);
 
       double f0 = statyczne_metody.licz_rownanie(this.rownanie, x0);
       // znaleziono dokładny wynik
       if(f0==0) {
            finish = true;
            break;
           }
       // obieremy kierunek dalszych poszukiwań
       if (fa * f0 < 0.0D) {
             b = x0;
             fb = f0;
           } else {
             a = x0;
             fa = f0;
           }
       
     if(step % 2 == 1)
         kolor=" class='gray' ";
        else kolor="";

     historia_buf+="<tr "+kolor+" ><td class='lewy' > " + ((this.kroki_ile - lic)+1) + ". = </td><td  class='prawy' > " + df.format(x0) + "</td></tr>\n";
     lic = statyczne_metody.dec(lic);
     if (lic < 1) {
            historia_buf="<tr ><td colspan='2' class='wynik' ><b> - przekroczono limit kroków</b></td></tr>\n";
            finish = false;
            }
     }
    // znaleziono wynik
    if (finish) 
        wyniki_buf+="<div class='wyniki' >Znaleziono rozwiązanie w <b>" + (this.kroki_ile - lic) + "</b> kroku = <b>" + df.format(x0)+"</b></div>\n";

    if(historia_buf.length()!=0)
        historia_buf=bufor+"<table class='lista' >"+historia_buf+"</table>";
     
    if(wyniki_buf.length()!=0)
             wyniki_buf=bufor+wyniki_buf;
        else wyniki_buf=bufor+"<div class='wynik2' ><b>Nie znaleziono rozwiązania ! </b></div>";

    wyn_v.add(wyniki_buf);
    his_v.add(historia_buf);

    log.setText("<html><head>"+statyczne_metody.mkStyle()+"</head><body>"+statyczne_metody.serializer(his_v)+"</body></html>");
    wyniki.setText("<html><head>"+statyczne_metody.mkStyle()+"</head><body>"+statyczne_metody.serializer(wyn_v)+"</body></html>");

     this.progres.setValue(0);
     this.progres.setVisible(false);
     this.panel.setEnabled(true);
   }
 }
