1   package fi.jyu.mit.graphics;
2   
3   import java.awt.Graphics;
4   
5   /**
6    * Luokka R->R funktion kuvaajan piirtämiseksi.
7    * @author Vesa Lappalainen
8    *
9    */
10  public class FunctionMapRR  extends BasicShape {
11      private double xmin,xmax;
12      private FunctionRR f;
13      private double z = 0.0;
14      
15      /**
16       * Luo uuden R->R funktion kuvaajan
17       * @param f piirrettävä funktio
18       * @param xmin x minimi
19       * @param xmax x maksimi
20       * @param z z-koordinaatin arvo
21       */
22      public FunctionMapRR(FunctionRR f, double xmin, double xmax, double z) {
23          this(f,xmin,xmax);
24          this.z = z;
25      }
26      
27      /**
28       * Luo uuden R->R funktion kuvaajan xy-tasoon
29       * @param f piirrettävä funktio
30       * @param xmin x minimi
31       * @param xmax x maksimi
32       */
33      public FunctionMapRR(FunctionRR f, double xmin, double xmax) {
34          super();
35          this.f = f;
36          this.xmin = xmin;
37          this.xmax = xmax;
38      }
39      
40      @Override
41      protected void drawShape(Graphics g, Matrix a) {
42          double dx = (xmax-xmin)/1000;
43          SPoint sp = new SPoint(0,0);
44          Vector vr = new Vector(); // NOPMD
45          int x1,y1,x2,y2;
46          
47          a.transform(vr.set(xmin,f.f(xmin),z),sp);
48          x1 = sp.getX();
49          y1 = sp.getY();
50          
51          for (double x = xmin+dx; x <= xmax; x+=dx) {
52              a.transform(vr.set(x,f.f(x),z),sp);
53              x2 = sp.getX();
54              y2 = sp.getY();
55              g.drawLine(x1,y1,x2,y2);
56              x1 = x2; y1 = y2;
57          }
58          a.transform(vr.set(xmax,f.f(xmax),z),sp);
59          x2 = sp.getX();
60          y2 = sp.getY();
61          g.drawLine(x1,y1,x2,y2);
62      }   
63  
64       /**
65         * Etsii funktion f minimin välillä [x1,x2] askeltaen dx:n kokoisilla
66         * askelilla.
67         * @param f  funktio jonka minimiä etsitään
68         * @param x1 aloituspiste
69         * @param x2 lopetuspiste
70         * @param dx askellusväli
71         * @return funktion minimi annetulla välillä
72         * @example
73         * <pre name="test">
74         * funMin(SinFun.sin, 0.0,1.0,0.1)         ~~~  0.0;
75         * funMin(SinFun.sin, 0.0,2*Math.PI,0.001) ~~~ -1.0;
76         * </pre>
77         */
78        public static double funMin(FunctionRR f,double x1, double x2, double dx) {
79          double fx,x,f_min = f.f(x2);
80          for (x = x1; x < x2; x+=dx) {
81            fx = f.f(x);
82            if ( fx < f_min ) f_min = fx;
83          }
84          return f_min;
85        }
86        
87        /**
88         * Etsii funktion f maksimin välillä [x1,x2] askeltaen dx:n kokoisilla
89         * askelilla.
90         * @param f  funktio jonka maskimia etsitään
91         * @param x1 aloituspiste
92         * @param x2 lopetuspiste
93         * @param dx askellusväli
94         * @return funktion maksimi annetulla välillä
95         * @example
96         * <pre name="test">
97         * funMax(SinFun.sin,-1.0,0.0,0.1)      ~~~ 0.0;
98         * funMax(SinFun.sin, 0.0,Math.PI,0.01) ~~~ 1.0;
99         * </pre>
100        */
101       public static double funMax(FunctionRR f,double x1, double x2, double dx) {
102         double fx,x,f_max=f.f(x2);
103         for (x = x1; x < x2; x+=dx) {
104           fx = f.f(x);
105           if ( fx > f_max ) f_max = fx;
106         }
107         return f_max;
108       }
109 }
110