ChartDirector 6.0 (ASP/COM/VB 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

[Web Version (in ASP)] aspdemo\contourinterpolate.asp
<%@ language="vbscript" %>
<%
Set cd = CreateObject("ChartDirector.API")

' This script can draw different charts depending on the chartIndex
chartIndex = CInt(Request("img"))

' The x and y coordinates of the grid
dataX = Array(-4, -3, -2, -1, 0, 1, 2, 3, 4)
dataY = Array(-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).
ReDim dataZ((UBound(dataX) + 1) * (UBound(dataY) + 1) - 1)
For yIndex = 0 To UBound(dataY)
    y = dataY(yIndex)
    For xIndex = 0 To UBound(dataX)
        x = dataX(xIndex)
        dataZ(yIndex * (UBound(dataX) + 1) + xIndex) = Sin(x * 3.1416 / 3) * Sin(y * 3.1416 / 3)
    Next
Next

' Create a XYChart object of size 360 x 360 pixels
Set c = cd.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
Call c.setPlotArea(30, 25, 300, 300, -1, -1, -1, &Hc0000000, -1)

' Add a contour layer using the given data
Set layer = c.addContourLayer(dataX, dataY, dataZ)

' Set the x-axis and y-axis scale
Call c.xAxis().setLinearScale(-4, 4, 1)
Call c.yAxis().setLinearScale(-4, 4, 1)

If chartIndex = 0 Then
    ' Discrete coloring, spline surface interpolation
    Call c.addTitle("Spline Surface - Discrete Coloring", "arialbi.ttf", 12)
ElseIf chartIndex = 1 Then
    ' Discrete coloring, linear surface interpolation
    Call c.addTitle("Linear Surface - Discrete Coloring", "arialbi.ttf", 12)
    Call layer.setSmoothInterpolation(False)
ElseIf chartIndex = 2 Then
    ' Smooth coloring, spline surface interpolation
    Call c.addTitle("Spline Surface - Continuous Coloring", "arialbi.ttf", 12)
    Call layer.setContourColor(cd.Transparent)
    Call layer.colorAxis().setColorGradient(True)
Else
    ' Discrete coloring, linear surface interpolation
    Call c.addTitle("Linear Surface - Continuous Coloring", "arialbi.ttf", 12)
    Call layer.setSmoothInterpolation(False)
    Call layer.setContourColor(cd.Transparent)
    Call layer.colorAxis().setColorGradient(True)
End If

' Output the chart
Response.ContentType = "image/jpeg"
Response.BinaryWrite c.makeChart2(cd.JPG)
Response.End
%>

[Windows Version (in Visual Basic)] vbdemo\contourinterpolate.cls
Public Sub createChart(viewer As Object, chartIndex As Integer)

    Dim cd As New ChartDirector.API

    ' The x and y coordinates of the grid
    Dim dataX()
    dataX = Array(-4, -3, -2, -1, 0, 1, 2, 3, 4)
    Dim dataY()
    dataY = Array(-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).
    ReDim dataZ((UBound(dataX) + 1) * (UBound(dataY) + 1) - 1)
    Dim yIndex As Long
    For yIndex = 0 To UBound(dataY)
        Dim y As Double
        y = dataY(yIndex)
        Dim xIndex As Long
        For xIndex = 0 To UBound(dataX)
            Dim x As Double
            x = dataX(xIndex)
            dataZ(yIndex * (UBound(dataX) + 1) + xIndex) = Sin(x * 3.1416 / 3) * Sin(y * 3.1416 /3)
        Next
    Next

    ' Create a XYChart object of size 360 x 360 pixels
    Dim c As XYChart
    Set c = cd.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
    Call c.setPlotArea(30, 25, 300, 300, -1, -1, -1, &Hc0000000, -1)

    ' Add a contour layer using the given data
    Dim layer As ContourLayer
    Set layer = c.addContourLayer(dataX, dataY, dataZ)

    ' Set the x-axis and y-axis scale
    Call c.xAxis().setLinearScale(-4, 4, 1)
    Call c.yAxis().setLinearScale(-4, 4, 1)

    If chartIndex = 0 Then
        ' Discrete coloring, spline surface interpolation
        Call c.addTitle("Spline Surface - Discrete Coloring", "arialbi.ttf", 12)
    ElseIf chartIndex = 1 Then
        ' Discrete coloring, linear surface interpolation
        Call c.addTitle("Linear Surface - Discrete Coloring", "arialbi.ttf", 12)
        Call layer.setSmoothInterpolation(False)
    ElseIf chartIndex = 2 Then
        ' Smooth coloring, spline surface interpolation
        Call c.addTitle("Spline Surface - Continuous Coloring", "arialbi.ttf", 12)
        Call layer.setContourColor(cd.Transparent)
        Call layer.colorAxis().setColorGradient(True)
    Else
        ' Discrete coloring, linear surface interpolation
        Call c.addTitle("Linear Surface - Continuous Coloring", "arialbi.ttf", 12)
        Call layer.setSmoothInterpolation(False)
        Call layer.setContourColor(cd.Transparent)
        Call layer.colorAxis().setColorGradient(True)
    End If

    ' Output the chart
    Set viewer.Picture = c.makePicture()

End Sub