1   package fi.jyu.mit.graphics;
2   
3   /**
4    * N:n asteen polynomi (N <= 15)
5    * @author Vesa Lappalainen
6    *
7    */
8   public class Polynom implements FunctionRR {
9       
10      private double k[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
11      private int deg = -1;
12      
13      /**
14       * Luo uuden ensimmäisen asteen polynomifunktion
15       * @param a ensimmäisen asteen termin kerroin
16       * @param b vakiotermin kerroin
17       */
18      public Polynom(double a, double b) {
19         deg = 1;
20         k[0] = b;
21         k[1] = a;
22      }
23      /**
24       * Luo uuden toisen asteen polynomifunktion
25       * @param a toisen asteen termin kerroin
26       * @param b ensimmäisen asteen termin kerroin
27       * @param c vakiotermin kerroin
28       */
29      public Polynom(double a, double b, double c) {
30          deg = 2;
31          k[0] = c;
32          k[1] = b;
33          k[2] = a;
34       }
35       
36      /**
37       * Luo uuden kolmannen asteen polynomifunktion
38       * @param a kolmannen asteen termin kerroin
39       * @param b toisen asteen termin kerroin
40       * @param c ensimmäisen asteen termin kerroin
41       * @param d vakiotermin kerroin
42       */
43      public Polynom(double a, double b, double c, double d) {
44          deg = 3;
45          k[0] = d;
46          k[1] = c;
47          k[2] = b;
48          k[3] = a;
49       }
50      
51      /**
52       * Luo uuden neljännen asteen polynomifunktion
53       * @param a neljännen asteen termin kerroin
54       * @param b kolmannen asteen termin kerroin
55       * @param c toisen asteen termin kerroin
56       * @param d ensimmäisen asteen termin kerroin
57       * @param e vakiotermin kerroin
58       */
59      public Polynom(double a, double b, double c, double d, double e) {
60          deg = 4;
61          k[0] = e;
62          k[1] = d;
63          k[2] = c;
64          k[3] = b;
65          k[4] = a;
66       }
67      
68      /**
69       * Asettaa n:n asteen termin kertoimen (n<=5)
70       * @param n aste (<=15)
71       * @param a n:n asteen termin kerroin
72       */
73      public void add(int n, double a) {
74          if ( n >= k.length ) return;
75          if ( n > deg ) deg = n;
76          k[n] = a;
77      }
78      
79      
80      /**
81       * Asettaa n:n asteen termin kertoimen 
82       * @param n aste (<=15)
83       * @param a n:n asteen termin kerroin
84       */
85      public void set(int n, double a) {
86          add(n,a);
87      }
88      
89      
90      /**
91       * Palauttaa n:n asteen termin kertoimen 
92       * @param n aste (<=15)
93       * @return n:n termin kerroin
94       */
95      public double get(int n) {
96          if ( n > deg ) return 0;
97          return k[n];
98      }
99  
100     
101     /**
102      * Palauttaa polynoimin asteluvun 
103      * @return n:n termin kerroin
104      */
105     public int getDeg() {
106         return deg;
107     }
108     
109     
110     /**
111      * Polynomi funktion arvo pisteessä x 
112      * Lasketaan polynomi ax2 + bx +c
113      * muodossa (ax+b)*x + c
114      * @param x mistä polynomin arvo lasketaan
115      * @return polynomin arvo pisteessä x
116      * 
117      */
118     @Override
119     public double f(double x) {  // NOPMD, nyt f on hyvä nimi
120         if ( deg == -1 ) return 0;  
121         double s = k[deg];  
122         for (int i=deg-1; i>=0; i--) 
123             s = s*x + k[i];
124         return s;
125     }   
126 }
127