From: <nic...@fr...> - 2003-11-17 16:17:58
|
Hello, I've just made a first version of a Cyclic Axis, together with the corresponding Cyclic renderer. The idea is to split the values into frames of fixed length, and cycling from one side of the frame to the other as the values increase. This is especially useful with dynamic data. Here is a screenshot: http://jsynoptic.sourceforge.net/CyclicNumberAxis.png The bottom plot shows a typical use of a cyclic axis : here the domain axis is set with a period of 500 units, and three variables are monitored over time. The top plot shows the most complex example, with 2 cycling axis. You can reproduce this example and play with the dynamic aspect (I didn't make a video!) with the latest JSynoptic CVS and the sample values provided (reminder: 24h delay on sourceforge for anonymous checkouts...). The cyclic axis was tested in both horizontal and vertical orientations, and in both direct or inverted directions. The renderer was tested with all those axis parameters, in any combination of cyclic domain and range axis (the most difficult beeing when both are cycling). I'll commit the code to JFreeChart if nobody objects, it really consists in 2 independant classes with no modifications at all in any other class. I was thinking about the 0.9.14 release and not breaking anything, but unfortunately I could not make it in time : maybe for 0.9.15! So, of that's OK, I may even do one or two junit tests, and include the axis in the dynamic part of the demo application. Cheers, Nicolas P.S: More Explanations on how it works below: Traditional representation of data in the range x0..x1 |-------------------------| x0 x1 Here, the range bounds are at the axis extremities. With cyclic axis, however, the time is split in "cycles", or "time frames", or the same duration : the period. A cycle axis cannot by definition handle a larger interval than the period : x1 - x0 >= period. Thus, at most a full period can be represented with such an axis. The cycle bound is the number between x0 and x1 which marks the beginning of new time frame: |---------------------|----------------------------| x0 cb x1 <---previous cycle---><-------current cycle--------> It is actually a multiple of the period, plus optionally a start offset: cb = n * period + offset Thus, by definition, two consecutive cycle bounds are period apart, which is precisely why it is called a period. The visual representation of a cyclic axis is like that: |----------------------------|---------------------| cb x1|x0 cb <-------current cycle--------><---previous cycle---> The cycle bound is at the axis ends. The current cycle is shown, then the last cycle. When using dynamic data, the visual effect is of the current cycle erasing the last cycle as x grows. Then, the next cycle bound is reached, and the process starts over, erasing the previous cycle. The Cyclic item renderer is provided to do exactly this. The renderer job is to create new points at cycle bounds, and map then to the correct axis extremities. This is made so that a line is not drawn across the chart when a cycling occurs : in such a case, two portions of lines are drawn, one for each axis end. Of course, things become slightly more complicated when the range and domain axis are both cycling => there can be up to 3 line segments in this case (assuming, which is the case, that the data represented does not exceed the period in length). P.P.S.: I did a CyclicNumberAxis because that's what I use. A CyclicDateAxis would be possible too. |