I’ve been very quiet over the last few months, and for good reason. Just finished a gig involving two pretty complex learning applications for physical science. I worked on one as a primary developer, and the function graphing engine I authored was used in another. This is the first of a couple posts summarizing the work before returning to development of the Freehand Drawing Library.
The prior update on the function graphing engine was summarized in this post. This particular learning application involves chemical reactions and equilibrium. A simulation is started in one tab, as shown below.
Depending on the simulation length, a substantial number of molecules may interact in a single time step. Clicking on the Graph tab shows a real-time line plot of the state of various reactions.
The x-axis is time steps and the programmer plots the most recent N steps.
A new addition to the graphing engine is the ability to adjust x- and y-axis bounds and tic marks independently. This provides highly customizable zoom capability.
The graph may be panned by dragging, and panning is setup in XML to be restricted to the first quadrant.
This was a very interesting project both because I enjoyed working with the other application developer and to see a cool use of the function graphing engine.
I wrote a class library for function graphing and exploration (with several complex, interactive features) years ago that uses XML for most of the graphing setup. The library dealt with functions defined by a modest number of parameters whose values may change, but the basic functional representation is immutable.
A student might explore x2 + 3x + 2 over a variety of intervals, or may even study ax2 + bx + c, where the constants a, b, and c are interactively varied. The function is still defined, in advance, by a small, finite number of parameters.
My client recently wished to use this engine to explore functions that arise from physical simulations over time. The ‘function’ is not mathematically defined by a formula. Instead, its values are sampled over time. Data points are plotted either separately, or connected by lines. Two new low-level functions, ScatterPlot and LinePlot were introduced into the defined functions library and new methods were added to the function graphing class to allow data that ‘defines’ a function to be updated at runtime. New methods to adjust the graph range and tic increments were also added.
The function graphing engine now supports panning restrictions by quadrant. Many physical simulations are sampled over time intervals, so the graph x-coordinate is a time sample (always greater than or equal to zero). For simulations whose y-axis values are positive, restricting graph panning to the first quadrant is desirable. One or two-quadrant combination panning restrictions are now allowed in the function graph XML.
<learningObject id=”simulationGraph” class=”display.graphing.functions.FunctionPlot” x=”35″ y=”40″ width=”350″ height=”280″ display=”f1,f2,f3″ pannable=”true” restrictPan=”quadrant:1″ >
Here’s a screenshot of the engine in action,
The modifications have been quite interesting, but would have been far more difficult without the extreme level of internal and external documentation generated for this complex class library. Over two years went by between modifications. So, think about the next person that comes along after your code is written.
It might be you 🙂