1   package fi.jyu.mit.graphics;
2   
3   /**
4    * Luokka 4x1 vektoreille
5    * @author Markus Kivioja
6    *
7    */
8   public class Vector {
9       
10      private final static int VSIZE = 4;
11      private double[] ar = new double[VSIZE];
12      
13      /**
14       * Luo uuden 4x1 vektorin (0.0, 0.0, 0.0, 1.0)T
15       *
16       */
17      public Vector() {
18          ar[0] = 0.0;
19          ar[1] = 0.0;
20          ar[2] = 0.0;
21          ar[3] = 1.0;
22      }
23      
24      /**
25       * Luo uuden 4x1 vektorin annetuista alkioista siten, että viimeinen alkio on 1.0
26       * @param a0 alkio (0, 0)
27       * @param a1 alkio (1, 0)
28       * @param a2 alkio (2, 0)
29       */
30      public Vector(double a0, double a1, double a2) {
31          ar[0] = a0;
32          ar[1] = a1;
33          ar[2] = a2;
34          ar[3] = 1.0;
35      }
36      
37      /**
38       * Luo uuden 4x1 vektorin jossa annetussa paikassa on annettu alkio
39       * @param i paikka johon alkio asetetaan
40       * @param ai asetettava alkio
41       */
42      public Vector(int i, double ai) {
43          for (int j = 0; j < VSIZE; j++) ar[j] = 0.0;
44          ar[i] = ai;
45      }
46      
47      /**
48       * Asettaa vektorin annettuun paikkaan annetun alkion
49       * @param i paikka johon alkio asetetaan
50       * @param ai asetettava alkio
51       * @return tämä vektori muutoksen jälkeen
52       */
53      public Vector set(int i, double ai) { // NOPMD, PMD sotkee väärään vektoriin
54          this.ar[i] = ai;
55          return this;
56      }
57      
58      /**
59       * Asettaa vektorin kolme ensimmäistä alkiota
60       * @param x alkio (0, 0)
61       * @param y alkio (1, 0)
62       * @param z alkio (2, 0)
63       * @return tämä vektori muutoksen jälkeen
64       */
65      public Vector set(double x, double y, double z) { // NOPMD
66          this.ar[0] = x;
67          this.ar[1] = y;
68          this.ar[2] = z;
69          return this;
70      }
71      
72      /**
73       * Asettaa vektorin kaksi ensimmäistä alkiota
74       * @param x alkio (0, 0)
75       * @param y alkio (1, 0)
76       * @return tämä vektori muutoksen jälkeen
77       */
78      public Vector set(double x, double y) { // NOPMD
79          this.ar[0] = x;
80          this.ar[1] = y;
81          return this;
82      }
83      
84      /**
85       * Laskee tämän ja annetun vektorin sisätulon
86       * @param b vektori jonka kanssa sisätulo lasketaan
87       * @return tämän ja annetun vektorin sisätulo
88       */
89      public double innerProduct(Vector b) { // NOPMD
90          double s = 0;
91          for (int i = 0; i < VSIZE; i++)
92              s += ar[i] * b.ar[i];
93          return s;
94      }
95      
96      /**
97       * Kertoo tätä vektoria annetulla skalaarilla
98       * @param y kertova skalaari
99       * @return tämä vektori kerrottuna annetulla skalaarilla
100      */
101     public Vector scalarProduct(double y) { // NOPMD
102         Vector p = new Vector(0, 0, 0); // NOPMD
103         for (int i = 0; i < VSIZE; i++)
104             p.ar[i] = this.ar[i]*y;
105         return p;
106     }
107     
108     /**
109      * Summaa tähän vektoriin annetun vektorin ja palauttaa tuloksen
110      * @param v summattava vektori
111      * @return tämän vektorin ja annetun vektorin summa
112      */
113     public Vector sum(Vector v) {
114         Vector sum = new Vector();
115         for (int i = 0; i < VSIZE; i++) {
116             sum.set(i, this.a(i)+v.a(i));
117         }
118         return sum;
119     }
120     
121     /**
122      * Palauttaa tämän vektorin annetussa paikassa olevan alkion
123      * @param i paikka josta alkio halutaan
124      * @return annetussa paikassa oleva alkio
125      */
126     public double a(int i) { // NOPMD, kelpaa tässä lyhytkin nimi
127         return this.ar[i];
128     }
129 }
130