(no commit message)
[utils] / gps / src / main / java / org / wamblee / gps / geometry / Coordinates.java
1 /*
2  * Copyright 2006 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */ 
16
17 package org.wamblee.gps.geometry;
18
19 import java.io.Serializable;
20
21 /**
22  * Coordinates in some 3-dimensional coordinate system.  
23  *
24  * @author Erik Brakkee
25  */
26 public class Coordinates implements Serializable {
27
28     private double _x1; 
29     private double _x2; 
30     private double _x3; 
31     
32     /**
33      * Constructs the coordinates. 
34      * @param aX1 First coordinate. 
35      * @param aX2 Second coordinate. 
36      * @param aX3 Third coordinate. 
37      */
38     public Coordinates(double aX1, double aX2, double aX3) { 
39         _x1 = aX1; 
40         _x2 = aX2;
41         _x3 = aX3; 
42     }
43     
44     public double getX1() { 
45         return _x1; 
46     }
47     
48     public double getX2() { 
49         return _x2; 
50     }
51     
52     public double getX3() { 
53         return _x3; 
54     }
55     
56     public double getX(int i) { 
57         switch (i) { 
58         case 1: return _x1; 
59         case 2: return _x2;
60         case 3: return _x3;
61         }
62         throw new IllegalArgumentException("coordinate out of range " + i);
63     }
64     
65     /* (non-Javadoc)
66      * @see java.lang.Object#toString()
67      */
68     @Override
69     public String toString() {
70         return "(" + getX1() + ", " + getX2() + ", " + getX3() + ")";
71     }
72     
73     public Coordinates add(Coordinates aC) { 
74         return new Coordinates(_x1 + aC._x1, _x2 + aC._x2, _x3 + aC._x3);
75     }
76     
77     public Coordinates subtract(Coordinates aC) { 
78         return new Coordinates(_x1 - aC._x1, _x2 - aC._x2, _x3 - aC._x3);
79     }
80   
81     public double innerProduct(Coordinates aC) { 
82         return _x1 * aC._x1 + _x2 * aC._x2 +  _x3 * aC._x3;
83     }
84     
85     public Coordinates outerProduct(Coordinates aC) { 
86         return new Coordinates(
87            _x2*aC._x3 - _x3*aC._x2,
88            -_x1*aC._x3 + _x3*aC._x1,
89            _x1*aC._x2 - _x2*aC._x1
90         );
91     }
92     
93     public double norm() { 
94         return Math.sqrt(innerProduct(this));
95     }
96     
97     public Coordinates scale(double aMultiplier) { 
98         return new Coordinates(_x1*aMultiplier, _x2*aMultiplier, _x3*aMultiplier);
99     }
100     
101     public Coordinates normalize() {
102         return scale(1.0/norm());
103     }
104 }