Source code: com/arranger/jarl/util/InterpolationPair.java
1 package com.arranger.jarl.util;
2
3 public class InterpolationPair {
4
5 protected Segment m_segmentOne;
6 protected Segment m_segmentTwo;
7 protected double m_slope;
8 protected double m_yintercept;
9
10 /**
11 * (x1, y1) (x2, y2)
12 *
13 *
14 * y = mx + b
15 * m = y2 - y2 / x2 - x1
16 * b = y - mx
17 *
18 */
19 public InterpolationPair(Segment segmentOne, Segment segmentTwo) {
20 m_segmentOne = segmentOne;
21 m_segmentTwo = segmentTwo;
22
23 /*if (m_segmentOne.m_xval > m_segmentTwo.m_xval) {
24 //throw new IllegalArgumentException("invalid Segment order: " + this.toString());
25 System.out.println("going backwards...");
26 }*/
27
28 //solve slope
29 m_slope = (m_segmentTwo.m_yval - m_segmentOne.m_yval) /
30 (m_segmentTwo.m_xval - m_segmentOne.m_xval);
31 //solve y-intercept
32 m_yintercept = m_segmentOne.m_yval - (m_slope * m_segmentOne.m_xval);
33 }
34
35 /**
36 * -1, means too small
37 * 0, means correct
38 * 1, means to large
39 */
40 public int checkRange(double xval) {
41 if (xval < m_segmentOne.m_xval) {
42 return -1;
43 }
44 if (m_segmentTwo.m_xval >= xval) {
45 return 0;
46 }
47 return 1;
48 }
49
50 /**
51 * y = mx + b
52 * we know m, x & b
53 */
54 public double getYValue(double xval) {
55 return getYValue(xval, true);
56 }
57
58 /**
59 * If interpolate is turned off, then it returns the value closest to the target segment
60 */
61 public double getYValue(double xval, boolean interpolate) {
62 int range = checkRange(xval);
63 if (range == -1) {
64 return m_segmentOne.m_yval;
65 } else if (range == 1) {
66 return m_segmentTwo.m_yval;
67 } else {
68 if (interpolate) {
69 return (xval * m_slope) + m_yintercept;
70 } else {
71 //is xval closer to m_segmentOne.m_xval or m_segmentTwo.m_xval
72 double distanceOne = Math.abs(m_segmentOne.m_xval - xval);
73 double distanceTwo = Math.abs(m_segmentTwo.m_xval - xval);
74
75 if (distanceOne == Math.min(distanceOne, distanceTwo)) {
76 return m_segmentOne.m_yval;
77 } else {
78 return m_segmentTwo.m_yval;
79 }
80 }
81 }
82 }
83
84 public String toString() {
85 StringBuffer buffer = new StringBuffer(100);
86 buffer.append(m_segmentOne.toString());
87 buffer.append(m_segmentTwo.toString());
88 buffer.append(" slope: " + m_slope);
89 buffer.append(" y-int: " + m_yintercept);
90 return buffer.toString();
91 }
92
93 public Segment getSegmentOne() {
94 return m_segmentOne;
95 }
96
97 public Segment getSegmentTwo() {
98 return m_segmentTwo;
99 }
100
101 public double getSlope() {
102 return m_slope;
103 }
104
105 public double getYintercept() {
106 return m_yintercept;
107 }
108
109 public static class Segment {
110
111 public double m_xval;
112 public double m_yval;
113
114 public Segment(double xval, double yval) {
115 m_xval = xval;
116 m_yval = yval;
117 }
118
119 public String toString() {
120 return "[" + m_xval + ", " + m_yval + "]";
121 }
122 }
123 }