ChartDirector 6.0 (Perl Edition)

Contour Interpolation


      

This example demonstrates spline and linear surface interpolation, and discrete and continuous coloring for the ContourLayer.

The input to the contour layer are the z values at certain (x, y) points. To draw the contour and to color the layer, it is necessarily to know the z values at all pixels in the xy plane. ChartDirector uses surface interpolation to compute the z values at all pixels from the given data points. Two types of interpolation - spline and linear - are supported. They can be configured using ContourLayer.setSmoothInterpolation.

The coloring of the contour layer can be discrete or continuous, configurable using ColorAxis.setColorGradient or ColorAxis.setColorScale.

Source Code Listing

[Standalone Version] perldemo\contourinterpolate.pl
#!/usr/bin/perl

# In the sample code, the ChartDirector for Perl module is assumed to be in "../lib"
use File::Basename;
use lib (dirname($0)."/../lib") =~ /(.*)/;

use perlchartdir;

sub createChart
{
    my $chartIndex = shift;

    # The x and y coordinates of the grid
    my $dataX = [-4, -3, -2, -1, 0, 1, 2, 3, 4];
    my $dataY = [-4, -3, -2, -1, 0, 1, 2, 3, 4];

    # The values at the grid points. In this example, we will compute the values using the formula z
    # = Sin(x * pi / 3) * Sin(y * pi / 3).
    my $dataZ = [(0) x (scalar(@$dataX) * scalar(@$dataY))];
    for(my $yIndex = 0; $yIndex < scalar(@$dataY); ++$yIndex) {
        my $y = $dataY->[$yIndex];
        for(my $xIndex = 0; $xIndex < scalar(@$dataX); ++$xIndex) {
            my $x = $dataX->[$xIndex];
            $dataZ->[$yIndex * scalar(@$dataX) + $xIndex] = sin($x * 3.1416 / 3) * sin($y * 3.1416 /
                3);
        }
    }

    # Create a XYChart object of size 360 x 360 pixels
    my $c = new XYChart(360, 360);

    # Set the plotarea at (30, 25) and of size 300 x 300 pixels. Use semi-transparent black
    # (c0000000) for both horizontal and vertical grid lines
    $c->setPlotArea(30, 25, 300, 300, -1, -1, -1, 0xc0000000, -1);

    # Add a contour layer using the given data
    my $layer = $c->addContourLayer($dataX, $dataY, $dataZ);

    # Set the x-axis and y-axis scale
    $c->xAxis()->setLinearScale(-4, 4, 1);
    $c->yAxis()->setLinearScale(-4, 4, 1);

    if ($chartIndex == 0) {
        # Discrete coloring, spline surface interpolation
        $c->addTitle("Spline Surface - Discrete Coloring", "arialbi.ttf", 12);
    } elsif ($chartIndex == 1) {
        # Discrete coloring, linear surface interpolation
        $c->addTitle("Linear Surface - Discrete Coloring", "arialbi.ttf", 12);
        $layer->setSmoothInterpolation(0);
    } elsif ($chartIndex == 2) {
        # Smooth coloring, spline surface interpolation
        $c->addTitle("Spline Surface - Continuous Coloring", "arialbi.ttf", 12);
        $layer->setContourColor($perlchartdir::Transparent);
        $layer->colorAxis()->setColorGradient(1);
    } else {
        # Discrete coloring, linear surface interpolation
        $c->addTitle("Linear Surface - Continuous Coloring", "arialbi.ttf", 12);
        $layer->setSmoothInterpolation(0);
        $layer->setContourColor($perlchartdir::Transparent);
        $layer->colorAxis()->setColorGradient(1);
    }

    # Output the chart
    $c->makeChart("contourinterpolate$chartIndex.jpg")
}

createChart(0);
createChart(1);
createChart(2);
createChart(3);

[CGI Version] perldemo_cgi\contourinterpolate.pl
#!/usr/bin/perl

# In the sample code, the ChartDirector for Perl module is assumed to be in "../lib"
use File::Basename;
use lib (dirname($0)."/../lib") =~ /(.*)/;

use perlchartdir;

# Get HTTP query parameters
use CGI;
my $query = new CGI;

# This script can draw different charts depending on the chartIndex
$chartIndex = int($query->param("img"));

# The x and y coordinates of the grid
my $dataX = [-4, -3, -2, -1, 0, 1, 2, 3, 4];
my $dataY = [-4, -3, -2, -1, 0, 1, 2, 3, 4];

# The values at the grid points. In this example, we will compute the values using the formula z =
# Sin(x * pi / 3) * Sin(y * pi / 3).
my $dataZ = [(0) x (scalar(@$dataX) * scalar(@$dataY))];
for(my $yIndex = 0; $yIndex < scalar(@$dataY); ++$yIndex) {
    my $y = $dataY->[$yIndex];
    for(my $xIndex = 0; $xIndex < scalar(@$dataX); ++$xIndex) {
        my $x = $dataX->[$xIndex];
        $dataZ->[$yIndex * scalar(@$dataX) + $xIndex] = sin($x * 3.1416 / 3) * sin($y * 3.1416 / 3);
    }
}

# Create a XYChart object of size 360 x 360 pixels
my $c = new XYChart(360, 360);

# Set the plotarea at (30, 25) and of size 300 x 300 pixels. Use semi-transparent black (c0000000)
# for both horizontal and vertical grid lines
$c->setPlotArea(30, 25, 300, 300, -1, -1, -1, 0xc0000000, -1);

# Add a contour layer using the given data
my $layer = $c->addContourLayer($dataX, $dataY, $dataZ);

# Set the x-axis and y-axis scale
$c->xAxis()->setLinearScale(-4, 4, 1);
$c->yAxis()->setLinearScale(-4, 4, 1);

if ($chartIndex == 0) {
    # Discrete coloring, spline surface interpolation
    $c->addTitle("Spline Surface - Discrete Coloring", "arialbi.ttf", 12);
} elsif ($chartIndex == 1) {
    # Discrete coloring, linear surface interpolation
    $c->addTitle("Linear Surface - Discrete Coloring", "arialbi.ttf", 12);
    $layer->setSmoothInterpolation(0);
} elsif ($chartIndex == 2) {
    # Smooth coloring, spline surface interpolation
    $c->addTitle("Spline Surface - Continuous Coloring", "arialbi.ttf", 12);
    $layer->setContourColor($perlchartdir::Transparent);
    $layer->colorAxis()->setColorGradient(1);
} else {
    # Discrete coloring, linear surface interpolation
    $c->addTitle("Linear Surface - Continuous Coloring", "arialbi.ttf", 12);
    $layer->setSmoothInterpolation(0);
    $layer->setContourColor($perlchartdir::Transparent);
    $layer->colorAxis()->setColorGradient(1);
}

# Output the chart
binmode(STDOUT);
print "Content-type: image/jpeg\n\n";
print $c->makeChart2($perlchartdir::JPG);