A C++ implementation of an improved contour plotting algorithmBy Jonathan de HalleuxThis class generates isocurves of a user defined function. Curves are drawn to OpenGL dc or stored in line strips. | VC6, VC7Win2K, WinXP, MFC, VS6, Dev
|
|
Introduction
This article presents a contour plot class. It is designed to draw iso-contour of a user-defined function f(x,y). I wrote it to integrate it in a graphic library : Plot Graphic Library
The class is based on the algorithm presented in [1] (Check References section). It is basically an improved version of the Level Curve Tracing Algorithm.
Understanding the algorithm
The algorithm uses several tuning parameter that the user must choose in order to have the best quality/performance ratio of the algorithm :
- Domain of x,y:
// Setting domain x=[0,1], y=[2,3] double pLimits[4]={0,1,2,3,4}; CContour contour; contour.SetLimits(pLimits);
- Size of the primary grid : The grid on which evaluate the function f(x,y). See
SetFirGrid, GetColFir, GetRowFir
. The parameter influence greatly the quality of the contour. - Size of the secondary grid : The grid where the function is going to be evaluated. This grid can be much finer that the first grid. See
SetSecGrid, GetColSec, GetRowSec
.
Classes
CContour
Main contour class. This class cannot be directly but has to be inherited. The inherited class must implement the ExportLine
function. To generate contours, use
void Generate()
Make to have set the field function (f(x,y)) before calling this function. The function will call ExportLine
for each new segment.
CGLContour
Use this class to draw contours to an OpenGL device context.
CListContour
Use this class to generate contour and store them as line strip. The user can retrieve each contour and use it as he wills. This function uses to sub-classes :
CLineStrip
, alist < int >
containing the index of the points.CLineStripList
, alist <CLineStrip*>
.
The line strip can be accessed by
CLineStripList* GetList(iPane);
where iPane
is the index of the contour.
How to...
Set up a contour object
Suppose that we have inherited a class from CContour
and overriden ExportLine
function.
class CMyContour : CContour { void ExportLine(...); }
Now, first set the function f(x,y):
double myF(double x, double y) { [...] return ... }; CMyContour contour; // Setting f(x,y)=myF contour.SetFieldFcn(myF);
Then set the iso-contour values, i.e.
int n; CMyContour contour; vector<double> vIso(n); for (int i=0;i<n;i++) { ... } // setting iso-lines contour.SetPlanes(vIso);
The contour is ready to be used.
Draw contours using OpenGL
CGLContour
as inherited function of CContour
. CGLContour contour; // Setting up contour : setting f, domain of x, // isocurve values [...] // generating contour contour.Generate();
Retrieve contours in line strip
Use CListContour
as inherited function of CContour
. Only the index of the points with respect to second grid are stored in the list. You can access their real value by using GetXi()
and GetYi()
functions.
CGLContour contour; // Setting up contour : setting f, // domain of x, isocurve values [...] // generating contour contour.Generate(); // Retreiving info CLineStripList* pStripList; // getting 0-th iso-curve pStripList=contour.GetLines(0); ASSERT(pStripList); // iterating liststrip vertices CLineStrip::iterator pos; for (pos=pStripList->begin(); pos != pStripList->end() ; pos++) { pStrip=(*pos); ASSERT(pStrip); if (pStrip->empty()) continue; // using info of strip list // pStrip contains the succesive index of the points // See CContourGLDoc.OnDraw for further details [...] }
Updates
- August, 31, 2002 Added contribution from Chenggang Zhou: better strip compression, threshold merging, area of strip, boundary detection, Also some minor changes I don't remember...
- March, 4, 2002 All the code is now using STL. :)
References
- [1] "Implementation of an improved contour plotting algorithm.", M. Aramini. Submitted in partial fulfillment of the requirements for the degree of Master of Science in Computer Science in the Graduate College of the University of Illinois at Urbana-Champaign, 1981.
License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
About the Author
Jonathan de Halleux Member | Jonathan de Halleux is Civil Engineer in Applied Mathematics. He finished his PhD in 2004 in the rainy country of Belgium. After 2 years in the Common Language Runtime (i.e. .net), he is now working at Microsoft Research on Pex (http://research.microsoft.com/pex).
|
'기본 카테고리' 카테고리의 다른 글
3D Graph ActiveX Control (0) | 2009.05.21 |
---|---|
2D Graph ActiveX Control (0) | 2009.05.21 |
Fault-tolerant 시스템과 Erlang (0) | 2009.05.20 |
구글 안드로이드 플랫폼 아키텍처 (0) | 2009.05.19 |
안드로이드(Android SDK 1.0) (0) | 2009.05.19 |