00001
00002
00003
00004
00005
00006
00007 package org.swtchart.internal.compress;
00008
00009 import java.util.ArrayList;
00010
00014 public class CompressLineSeries extends Compress {
00015
00017 enum STATE {
00019 SteppingOverXRange,
00020
00022 SteppingOverYRange,
00023
00025 OutOfRangeAgain,
00026
00028 SteppingOutOfXRange,
00029
00031 SteppingInXRange,
00032
00034 SteppingOutOfYRange,
00035
00037 SteppingOutOfRange,
00038
00040 InRangeAgain,
00041
00043 SteppingInRange;
00044 }
00045
00047 private boolean isPrevOutOfRange;
00048
00049
00050
00051
00052 @Override
00053 protected void addNecessaryPlots(ArrayList<Double> xList,
00054 ArrayList<Double> yList, ArrayList<Integer> indexList) {
00055
00056 isPrevOutOfRange = true;
00057
00058 for (int i = 0; i < xSeries.length && i < ySeries.length; i++) {
00059 STATE state = getState(i);
00060
00061 switch (state) {
00062 case SteppingOutOfYRange:
00063 addToList(xList, yList, indexList, xSeries[i], ySeries[i], i);
00064 break;
00065 case SteppingOverYRange:
00066 case SteppingInRange:
00067 case SteppingInXRange:
00068 addToList(xList, yList, indexList, xSeries[i - 1],
00069 ySeries[i - 1], i - 1);
00070 addToList(xList, yList, indexList, xSeries[i], ySeries[i], i);
00071 break;
00072 case SteppingOverXRange:
00073 case SteppingOutOfXRange:
00074 addToList(xList, yList, indexList, xSeries[i - 1],
00075 ySeries[i - 1], i - 1);
00076 addToList(xList, yList, indexList, xSeries[i], ySeries[i], i);
00077 i = xSeries.length;
00078 break;
00079 case SteppingOutOfRange:
00080 addToList(xList, yList, indexList, xSeries[i], ySeries[i], i);
00081 i = xSeries.length;
00082 break;
00083 case InRangeAgain:
00084 if (!isInSameGridAsPrevious(xSeries[i], ySeries[i])) {
00085 addToList(xList, yList, indexList, xSeries[i], ySeries[i],
00086 i);
00087 }
00088 break;
00089 case OutOfRangeAgain:
00090 break;
00091 default:
00092 break;
00093 }
00094 }
00095 }
00096
00104 private STATE getState(int index) {
00105
00106 STATE state;
00107
00108 if (xLower <= xSeries[index] && xSeries[index] <= xUpper) {
00109 if (yLower <= ySeries[index] && ySeries[index] <= yUpper) {
00110 if (index > 0 && isPrevOutOfRange) {
00111 state = STATE.SteppingInRange;
00112 } else {
00113 state = STATE.InRangeAgain;
00114 }
00115 } else {
00116 if (isPrevOutOfRange) {
00117 if (index > 0
00118 && ((ySeries[index - 1] < yLower && ySeries[index] > yUpper) || ySeries[index - 1] > yUpper
00119 && ySeries[index] < yLower)) {
00120 state = STATE.SteppingOverYRange;
00121 } else if (index > 0 && xSeries[index - 1] < xLower
00122 && xSeries[index] > xLower) {
00123 state = STATE.SteppingInXRange;
00124 } else {
00125 state = STATE.OutOfRangeAgain;
00126 }
00127 } else {
00128 state = STATE.SteppingOutOfYRange;
00129 }
00130 }
00131 } else {
00132 if (!isPrevOutOfRange) {
00133 state = STATE.SteppingOutOfRange;
00134 } else if (index > 0 && xSeries[index - 1] < xUpper
00135 && xSeries[index] > xUpper) {
00136 state = STATE.SteppingOutOfXRange;
00137 } else if (index > 0 && xSeries[index - 1] < xLower
00138 && xSeries[index] > xUpper) {
00139 state = STATE.SteppingOverXRange;
00140 } else {
00141 state = STATE.OutOfRangeAgain;
00142 }
00143 }
00144
00145
00146 if (xLower <= xSeries[index] && xSeries[index] <= xUpper
00147 && yLower <= ySeries[index] && ySeries[index] <= yUpper) {
00148 isPrevOutOfRange = false;
00149 } else {
00150 isPrevOutOfRange = true;
00151 }
00152
00153 return state;
00154 }
00155 }