Click here to Skip to main content
6,306,412 members and growing! (17,173 online)
Email Password   helpLost your password?
General Programming » Algorithms & Recipes » Algorithms     Intermediate

A C++ implementation of an improved contour plotting algorithm

By Jonathan de Halleux

This class generates isocurves of a user defined function. Curves are drawn to OpenGL dc or stored in line strips.
VC6, VC7Win2K, WinXP, MFC, Dev
Posted:9 Jan 2002
Updated:30 Jul 2002
Views:183,361
Bookmarked:44 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
19 votes for this article.
Popularity: 5.25 Rating: 4.11 out of 5
2 votes, 20.0%
1

2
1 vote, 10.0%
3
2 votes, 20.0%
4
5 votes, 50.0%
5

Sample Image - contour.jpg

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, a list < int > containing the index of the points.
  • CLineStripList, a list <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

Use 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

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).

Occupation: Engineer
Location: United States United States

Other popular Algorithms & Recipes articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 37 (Total in Forum: 37) (Refresh)FirstPrevNext
QuestionWhy I can not download the demo? Pinmemberbigsun690917:21 10 Jan '08  
GeneralHi,I have a contour ocx here.Would you want to try it?Thank you. Pinmembersnowedforest20:49 3 Feb '07  
GeneralBitmap PinmemberSangeetha_J21:04 25 Jan '07  
GeneralRe: Bitmap PinmemberSangeetha_J21:09 25 Jan '07  
GeneralImprovement Pinmemberlaurent garnier0:37 8 Feb '05  
GeneralDemo program crashes on redraw PinsussBen Discoe10:56 18 Aug '04  
Generalplotting Contour In an image PinmemberJobaida Begum8:45 6 Apr '04  
Generalfeature line extraction from contours Pinsusssanjayrana6:21 10 Jun '03  
GeneralImage Processing PinsussPrit9:50 13 Apr '03  
GeneralRe: Image Processing PinsupporterChris Losinger10:11 13 Apr '03  
GeneralRe: Image Processing PinmemberJonathan de Halleux22:12 13 Apr '03  
GeneralHelp! PinmemberWang_lei23:10 5 Sep '02  
GeneralNope PinmemberJonathan de Halleux22:15 15 Oct '02  
QuestionRe: Nope Pinmemberbigsun690917:19 10 Jan '08  
GeneralRe: Help! PinmemberTigga_12:12 23 Feb '07  
GeneralImprovement PinmemberC. G. Zhou21:24 22 Jul '02  
GeneralDid you do it ? Pinsusspeliikhan4:20 23 Jul '02  
GeneralRe: Did you do it ? PinsussC.G. Zhou9:29 25 Jul '02  
GeneralUpdated PinmemberJonathan de Halleux2:10 31 Jul '02  
GeneralHow to fill the contour with color? Pinsusswangchi21:04 17 Jul '02  
GeneralRe: How to fill the contour with color? PinmemberJonathan de Halleux23:13 17 Jul '02  
GeneralHow to fill the contour with color? PinsussAnonymous21:04 17 Jul '02  
GeneralRe: How to fill the contour with color? PinadminChris Maunder16:15 31 Jul '02  
GeneralGreat stuff PinmemberJonathan de Halleux23:06 31 Jul '02  
GeneralRe: Great stuff PinadminChris Maunder23:28 31 Jul '02  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 30 Jul 2002
Editor: Nishant Sivakumar
Copyright 2002 by Jonathan de Halleux
Everything else Copyright © CodeProject, 1999-2009
Web18 | Advertise on the Code Project