package int_test;
 
import java.text.DecimalFormat;
import java.util.Vector;
import javax.swing.JProgressBar;
import javax.swing.JEditorPane;
 
public class Silnik_metoda_newtona extends Thread {

   public JEditorPane log;
   public JEditorPane wyniki;
   
   public String rownanie;
   public double start;
   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.panel.setEnabled(false);
   this.progres.setVisible(true);

   String kolor="";
   int step=0;
   DecimalFormat df = new DecimalFormat("#,###.#########");

    String row_pochodnej = "";
    row_pochodnej = statyczne_metody.pochodna(this.rownanie);

    String bufor = "";
    bufor ="<table class='metoda' cellpadding='0' cellspacing='0' >";
    bufor+="<tr><td class='tyt3' >METODA NEWTONA </td></tr>";
    bufor+="<tr><td class='rownanie' > f(x)="+this.rownanie+" </td></tr>";
    bufor+="<tr><td class='rownanie' > f&rsquo;(x)="+row_pochodnej+" </td></tr>";
    bufor+="<tr><td class='przedzial' >Punkt startu: <b> " + this.start  + "</b></td></tr>";
    bufor+="</table>";

    wyniki_buf="";
    historia_buf="";

   boolean finish = true;

   double x0 = this.start;
   double x1 = this.start - 1.0D;
   double f1;
   double f0 = statyczne_metody.licz_rownanie(this.rownanie, this.start);
   int lic = this.kroki_ile;
   while ((lic > 0) && (Math.abs(x1 - x0) > this.EPSX)) {
       step++;
       f1= statyczne_metody.licz_rownanie(row_pochodnej, x0);
       // zły punkt startowy, pochodna = 0
       if (f1==0) {
           historia_buf="<tr ><td colspan='2' class='wynik' ><b> - zły punkt startowy</b></td></tr>\n";
           lic = 0;
           finish = false;
           break;
          }
       x1 = x0;
       x0 =x1-f0/f1;  //wzor newtona
       f0 = statyczne_metody.licz_rownanie(this.rownanie, x0);
       if(f0==0) {
            finish = true;
            break;
           }
       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;
           }
     }
 
     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);
  }
}
