Vector2D Series uses ChartDataModel. Series extracts coordinates of vectors packed into ChartDataModel array, maps and plots them. Each vector is drawn as an arrow.
Setting Vector Series:
// creates VectorSeries object named verctor1, with ChartDataModel instance // named vectorModel1, and xMapper, yMapper - instaces of AxisMapper VectorSeries vector1 = new VectorSeries(vectorModel1, xMapper, yMapper); |
Figure 4.1.7.1 Vector2D Series Demonstration
1 | import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import javax.swing.JFrame; import lt.monarch.chart.chart2D.Chart2D; import lt.monarch.chart.chart2D.Grid; import lt.monarch.chart.chart2D.axis.Axis2DX; import lt.monarch.chart.chart2D.axis.Axis2DY; import lt.monarch.chart.chart2D.engine.PlaneMapper2D; import lt.monarch.chart.chart2D.series.VectorSeries; import lt.monarch.chart.chart2D.series.VectorStrategies; import lt.monarch.chart.engine.ChartObject; import lt.monarch.chart.engine.SimpleHotSpotMap; import lt.monarch.chart.legend.Legend; import lt.monarch.chart.mapper.MathAxisMapper; import lt.monarch.chart.models.ChartDataModel; import lt.monarch.chart.swing.JChartPanel; import lt.monarch.chart.view.LabeledChart; public class Vector2DSeriesDemo extends JFrame { private JChartPanel m_chartPanel; public Vector2DSeriesDemo() { setLayout(new BorderLayout()); initChart(); add(m_chartPanel, BorderLayout.CENTER); } private void initChart() { /* * Creating chart */ Chart2D chart = new Chart2D(); /* * Creating data models */ ChartDataModel vectorModel1 = createDataModel1(); ChartDataModel vectorModel2 = createDataModel2(); /* * Creating mappers */ MathAxisMapper yMapper = new MathAxisMapper(0, 100); MathAxisMapper xMapper = new MathAxisMapper(0, 80); /* * Creating axes */ Axis2DX axisX = new Axis2DX(xMapper); Axis2DY axisY = new Axis2DY(yMapper); axisX.setTitle("x"); axisY.setTitle("y"); axisX.setScrollable(true); axisY.setScrollable(true); /* * Creating series */ VectorSeries vector1 = new VectorSeries(vectorModel1, xMapper, yMapper); vector1.setStrategy(VectorStrategies.VECTOR_STRATEGY); vector1.getPaintStyle().setStroke(new BasicStroke(0.5f)); vector1.getPaintStyle().setBackground(Color.BLUE); vector1.getPaintStyle().setForeground(Color.BLUE); vector1.setName("Cold current"); VectorSeries vector2 = new VectorSeries(vectorModel2, xMapper, yMapper); vector2.getPaintStyle().setStroke(new BasicStroke(0.5f)); vector2.getPaintStyle().setBackground(Color.RED); vector2.getPaintStyle().setForeground(Color.RED); vector2.setName("Warm current"); /* * Creating Grid */ Grid grid = new Grid(new PlaneMapper2D(), xMapper, yMapper); /* * Adding objects to chart */ chart.setObjects(new ChartObject[] { grid, vector1, vector2 }); chart.setYAxis(axisY); chart.setXAxis(axisX); /* * Creating labeled chart */ LabeledChart topChart = new LabeledChart(chart); topChart.setTitle("Current Movement"); /* * Creating legend */ Legend legend = new Legend(chart); legend.setMaxColumns(2); topChart.setBottomView(legend); m_chartPanel = new JChartPanel(topChart); m_chartPanel.setHotSpotMap(new SimpleHotSpotMap()); } public static void main(String[] args) { Vector2DSeriesDemo frame = new Vector2DSeriesDemo(); frame.setSize(new Dimension(600, 400)); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setTitle("Current Movement"); frame.setVisible(true); } private ChartDataModel createDataModel1() { ChartDataModel vectorModel1 = new ChartDataModel(4); vectorModel1.add(new Object[] { 0, 55, 10, 55 }); vectorModel1.add(new Object[] { 11, 55, 20, 55 }); vectorModel1.add(new Object[] { 21, 55, 24, 58 }); vectorModel1.add(new Object[] { 25, 58, 30, 60 }); vectorModel1.add(new Object[] { 31, 60, 34, 60 }); vectorModel1.add(new Object[] { 35, 60, 40, 55 }); vectorModel1.add(new Object[] { 41, 55, 46, 53 }); vectorModel1.add(new Object[] { 47, 53, 50, 51 }); vectorModel1.add(new Object[] { 51, 51, 56, 50 }); vectorModel1.add(new Object[] { 57, 50, 70, 50 }); vectorModel1.add(new Object[] { 71, 50, 80, 50 }); vectorModel1.add(new Object[] { 0, 58, 10, 58 }); vectorModel1.add(new Object[] { 11, 58, 20, 58 }); vectorModel1.add(new Object[] { 21, 58, 24, 61 }); vectorModel1.add(new Object[] { 25, 61, 30, 63 }); vectorModel1.add(new Object[] { 31, 63, 34, 63 }); vectorModel1.add(new Object[] { 35, 63, 40, 58 }); vectorModel1.add(new Object[] { 41, 58, 46, 56 }); vectorModel1.add(new Object[] { 47, 56, 50, 54 }); vectorModel1.add(new Object[] { 51, 54, 56, 53 }); vectorModel1.add(new Object[] { 57, 53, 70, 53 }); vectorModel1.add(new Object[] { 71, 53, 80, 53 }); vectorModel1.add(new Object[] { 0, 61, 10, 61 }); vectorModel1.add(new Object[] { 11, 61, 20, 61 }); vectorModel1.add(new Object[] { 21, 61, 24, 64 }); vectorModel1.add(new Object[] { 25, 64, 30, 66 }); vectorModel1.add(new Object[] { 31, 66, 34, 66 }); vectorModel1.add(new Object[] { 35, 66, 40, 61 }); vectorModel1.add(new Object[] { 41, 61, 46, 59 }); vectorModel1.add(new Object[] { 47, 59, 50, 57 }); vectorModel1.add(new Object[] { 51, 57, 56, 56 }); vectorModel1.add(new Object[] { 57, 56, 70, 56 }); vectorModel1.add(new Object[] { 71, 56, 80, 56 }); vectorModel1.add(new Object[] { 0, 64, 10, 64 }); vectorModel1.add(new Object[] { 11, 64, 20, 64 }); vectorModel1.add(new Object[] { 21, 64, 24, 67 }); vectorModel1.add(new Object[] { 25, 67, 30, 69 }); vectorModel1.add(new Object[] { 31, 69, 34, 69 }); vectorModel1.add(new Object[] { 35, 69, 40, 64 }); vectorModel1.add(new Object[] { 41, 64, 46, 61 }); vectorModel1.add(new Object[] { 47, 62, 50, 60 }); vectorModel1.add(new Object[] { 51, 60, 56, 59 }); vectorModel1.add(new Object[] { 57, 59, 70, 59 }); vectorModel1.add(new Object[] { 71, 59, 80, 59 }); return vectorModel1; } private ChartDataModel createDataModel2() { ChartDataModel vectorModel2 = new ChartDataModel(4); vectorModel2.add(new Object[] { 0, 55, 10, 53 }); vectorModel2.add(new Object[] { 11, 53, 20, 49 }); vectorModel2.add(new Object[] { 21, 49, 23, 45 }); vectorModel2.add(new Object[] { 24, 45, 30, 41 }); vectorModel2.add(new Object[] { 31, 41, 34, 37 }); vectorModel2.add(new Object[] { 35, 37, 40, 38 }); vectorModel2.add(new Object[] { 41, 38, 46, 42 }); vectorModel2.add(new Object[] { 47, 42, 50, 44 }); vectorModel2.add(new Object[] { 51, 44, 56, 46 }); vectorModel2.add(new Object[] { 57, 46, 70, 48 }); vectorModel2.add(new Object[] { 71, 48, 80, 50 }); vectorModel2.add(new Object[] { 0, 52, 10, 50 }); vectorModel2.add(new Object[] { 11, 50, 20, 46 }); vectorModel2.add(new Object[] { 21, 45, 23, 42 }); vectorModel2.add(new Object[] { 24, 42, 30, 38 }); vectorModel2.add(new Object[] { 31, 37, 34, 34 }); vectorModel2.add(new Object[] { 35, 34, 40, 35 }); vectorModel2.add(new Object[] { 41, 35, 46, 39 }); vectorModel2.add(new Object[] { 47, 39, 50, 41 }); vectorModel2.add(new Object[] { 51, 41, 56, 43 }); vectorModel2.add(new Object[] { 57, 42, 70, 45 }); vectorModel2.add(new Object[] { 71, 45, 80, 47 }); vectorModel2.add(new Object[] { 0, 49, 10, 47 }); vectorModel2.add(new Object[] { 11, 47, 20, 43 }); vectorModel2.add(new Object[] { 21, 42, 23, 39 }); vectorModel2.add(new Object[] { 24, 39, 30, 35 }); vectorModel2.add(new Object[] { 31, 34, 34, 31 }); vectorModel2.add(new Object[] { 35, 31, 40, 32 }); vectorModel2.add(new Object[] { 41, 32, 46, 36 }); vectorModel2.add(new Object[] { 47, 36, 50, 38 }); vectorModel2.add(new Object[] { 51, 38, 56, 40 }); vectorModel2.add(new Object[] { 57, 39, 70, 42 }); vectorModel2.add(new Object[] { 71, 42, 80, 46 }); vectorModel2.add(new Object[] { 0, 46, 10, 44 }); vectorModel2.add(new Object[] { 11, 44, 20, 40 }); vectorModel2.add(new Object[] { 21, 39, 23, 36 }); vectorModel2.add(new Object[] { 24, 36, 30, 32 }); vectorModel2.add(new Object[] { 31, 31, 34, 28 }); vectorModel2.add(new Object[] { 35, 28, 40, 29 }); vectorModel2.add(new Object[] { 41, 29, 46, 33 }); vectorModel2.add(new Object[] { 47, 33, 50, 35 }); vectorModel2.add(new Object[] { 51, 35, 56, 37 }); vectorModel2.add(new Object[] { 57, 36, 70, 39 }); vectorModel2.add(new Object[] { 71, 39, 80, 43 }); return vectorModel2; } } |
It is possible to set arrow angle for Vector Strategy, which determines what angle arrow and vector makes - angles from [5;45] interval are appreciated.
Setting angle:
((VectorStrategy)vector1.getStrategy()).setArrowAngle(15); //angle for vectors ((VectorStrategy)vector2.getStrategy()).setArrowAngle(30); //angle for sum |
Figure 4.1.7.2 Vector2D Arrow Angle Demonstration
There is a possibility to set arrow's inner head's position using setInnerArrowHeadPosition() method. Values from [0.2;1] interval should be used.
((VectorStrategy)vector1.getStrategy()).setInnerArrowHeadPosition(1d); //position for vectors ((VectorStrategy)vector2.getStrategy()).setArrowAngle(0.8d); //position for subtraction |
Figure 4.1.7.3 Vector2D Inner Arrow Head Demonstration