1:
42:
43: package ;
44:
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50:
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59:
60:
66: public class VectorRenderer extends AbstractXYItemRenderer
67: implements XYItemRenderer, Cloneable, Serializable {
68:
69:
70: private double baseLength = 0.10;
71:
72:
73: private double headLength = 0.14;
74:
75:
76:
80: public VectorRenderer() {
81: }
82:
83:
92: public Range findDomainBounds(XYDataset dataset) {
93: if (dataset == null) {
94: throw new IllegalArgumentException("Null 'dataset' argument.");
95: }
96: double minimum = Double.POSITIVE_INFINITY;
97: double maximum = Double.NEGATIVE_INFINITY;
98: int seriesCount = dataset.getSeriesCount();
99: double lvalue;
100: double uvalue;
101: if (dataset instanceof VectorXYDataset) {
102: VectorXYDataset vdataset = (VectorXYDataset) dataset;
103: for (int series = 0; series < seriesCount; series++) {
104: int itemCount = dataset.getItemCount(series);
105: for (int item = 0; item < itemCount; item++) {
106: double delta = vdataset.getVectorXValue(series, item);
107: if (delta < 0.0) {
108: uvalue = vdataset.getXValue(series, item);
109: lvalue = uvalue + delta;
110: }
111: else {
112: lvalue = vdataset.getXValue(series, item);
113: uvalue = lvalue + delta;
114: }
115: minimum = Math.min(minimum, lvalue);
116: maximum = Math.max(maximum, uvalue);
117: }
118: }
119: }
120: else {
121: for (int series = 0; series < seriesCount; series++) {
122: int itemCount = dataset.getItemCount(series);
123: for (int item = 0; item < itemCount; item++) {
124: lvalue = dataset.getXValue(series, item);
125: uvalue = lvalue;
126: minimum = Math.min(minimum, lvalue);
127: maximum = Math.max(maximum, uvalue);
128: }
129: }
130: }
131: if (minimum > maximum) {
132: return null;
133: }
134: else {
135: return new Range(minimum, maximum);
136: }
137: }
138:
139:
148: public Range findRangeBounds(XYDataset dataset) {
149: if (dataset == null) {
150: throw new IllegalArgumentException("Null 'dataset' argument.");
151: }
152: double minimum = Double.POSITIVE_INFINITY;
153: double maximum = Double.NEGATIVE_INFINITY;
154: int seriesCount = dataset.getSeriesCount();
155: double lvalue;
156: double uvalue;
157: if (dataset instanceof VectorXYDataset) {
158: VectorXYDataset vdataset = (VectorXYDataset) dataset;
159: for (int series = 0; series < seriesCount; series++) {
160: int itemCount = dataset.getItemCount(series);
161: for (int item = 0; item < itemCount; item++) {
162: double delta = vdataset.getVectorYValue(series, item);
163: if (delta < 0.0) {
164: uvalue = vdataset.getYValue(series, item);
165: lvalue = uvalue + delta;
166: }
167: else {
168: lvalue = vdataset.getYValue(series, item);
169: uvalue = lvalue + delta;
170: }
171: minimum = Math.min(minimum, lvalue);
172: maximum = Math.max(maximum, uvalue);
173: }
174: }
175: }
176: else {
177: for (int series = 0; series < seriesCount; series++) {
178: int itemCount = dataset.getItemCount(series);
179: for (int item = 0; item < itemCount; item++) {
180: lvalue = dataset.getYValue(series, item);
181: uvalue = lvalue;
182: minimum = Math.min(minimum, lvalue);
183: maximum = Math.max(maximum, uvalue);
184: }
185: }
186: }
187: if (minimum > maximum) {
188: return null;
189: }
190: else {
191: return new Range(minimum, maximum);
192: }
193: }
194:
195:
211: public void drawItem(Graphics2D g2, XYItemRendererState state,
212: Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot,
213: ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset,
214: int series, int item, CrosshairState crosshairState, int pass) {
215:
216: double x = dataset.getXValue(series, item);
217: double y = dataset.getYValue(series, item);
218: double dx = 0.0;
219: double dy = 0.0;
220: if (dataset instanceof VectorXYDataset) {
221: dx = ((VectorXYDataset) dataset).getVectorXValue(series, item);
222: dy = ((VectorXYDataset) dataset).getVectorYValue(series, item);
223: }
224: double xx0 = domainAxis.valueToJava2D(x, dataArea,
225: plot.getDomainAxisEdge());
226: double yy0 = rangeAxis.valueToJava2D(y, dataArea,
227: plot.getRangeAxisEdge());
228: double xx1 = domainAxis.valueToJava2D(x + dx, dataArea,
229: plot.getDomainAxisEdge());
230: double yy1 = rangeAxis.valueToJava2D(y + dy, dataArea,
231: plot.getRangeAxisEdge());
232: Line2D line;
233: PlotOrientation orientation = plot.getOrientation();
234: if (orientation.equals(PlotOrientation.HORIZONTAL)) {
235: line = new Line2D.Double(yy0, xx0, yy1, xx1);
236: }
237: else {
238: line = new Line2D.Double(xx0, yy0, xx1, yy1);
239: }
240: g2.setPaint(getItemPaint(series, item));
241: g2.setStroke(getItemStroke(series, item));
242: g2.draw(line);
243:
244:
245: double dxx = (xx1 - xx0);
246: double dyy = (yy1 - yy0);
247: double bx = xx0 + (1.0 - this.baseLength) * dxx;
248: double by = yy0 + (1.0 - this.baseLength) * dyy;
249:
250: double cx = xx0 + (1.0 - this.headLength) * dxx;
251: double cy = yy0 + (1.0 - this.headLength) * dyy;
252:
253: double angle = 0.0;
254: if (dxx != 0.0) {
255: angle = Math.PI / 2.0 - Math.atan(dyy / dxx);
256: }
257: double deltaX = 2.0 * Math.cos(angle);
258: double deltaY = 2.0 * Math.sin(angle);
259:
260: double leftx = cx + deltaX;
261: double lefty = cy - deltaY;
262: double rightx = cx - deltaX;
263: double righty = cy + deltaY;
264:
265: GeneralPath p = new GeneralPath();
266: p.moveTo((float) xx1, (float) yy1);
267: p.lineTo((float) rightx, (float) righty);
268: p.lineTo((float) bx, (float) by);
269: p.lineTo((float) leftx, (float) lefty);
270: p.closePath();
271: g2.draw(p);
272:
273:
274: }
275:
276:
290: public boolean equals(Object obj) {
291: if (obj == this) {
292: return true;
293: }
294: if (!(obj instanceof VectorRenderer)) {
295: return false;
296: }
297: VectorRenderer that = (VectorRenderer) obj;
298: if (this.baseLength != that.baseLength) {
299: return false;
300: }
301: if (this.headLength != that.headLength) {
302: return false;
303: }
304: return super.equals(obj);
305: }
306:
307:
315: public Object clone() throws CloneNotSupportedException {
316: return super.clone();
317: }
318:
319: }