Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }