[vtkusers] vtkChart large axis ranges
Andrew Ward
andrew.derek.ward at gmail.com
Thu May 22 22:10:29 EDT 2014
Hi Marcus,
Here is some code to reproduce the problem. Changing the RANGE_HIGH define
to 1e11 causes the plot to render incorrectly and the function to
disappear. I tried removing the relevant code in
vtkChart::CalculatePlotTransform, which helped with this range, but there
were still problems with the full float32 range.
Regards,
Andrew Ward.
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkContextView.h>
#include <vtkContextScene.h>
#include <vtkPiecewiseFunctionItem.h>
#include <vtkPiecewiseControlPointsItem.h>
#include <vtkPiecewiseFunction.h>
#include <vtkChartXY.h>
#include <vtkAxis.h>
#include <vtkTextProperty.h>
#include <vtkPlotBar.h>
#include <vtkPen.h>
#include <vtkBrush.h>
#include <vtkTable.h>
#include <vtkFloatArray.h>
#define RANGE_LOW -1e4
// Change this value to 1e11 and the bar plot renders incorrectly, plus the
// piecewise function points disappear.
#define RANGE_HIGH 1e9
vtkSmartPointer< vtkChartXY > GetNewChart()
{
vtkSmartPointer< vtkChartXY > chart = vtkSmartPointer< vtkChartXY
>::New();
vtkAxis *yAxis = chart->GetAxis(vtkAxis::LEFT);
vtkAxis *xAxis = chart->GetAxis(vtkAxis::BOTTOM);
xAxis->SetRange( RANGE_LOW, RANGE_HIGH);
xAxis->SetMinimumLimit( RANGE_LOW );
xAxis->SetMaximumLimit( RANGE_HIGH );
xAxis->SetBehavior(vtkAxis::FIXED);
yAxis->SetRange(0.0, 1.0);
yAxis->SetBehavior(vtkAxis::FIXED);
vtkSmartPointer< vtkTable > table = vtkSmartPointer< vtkTable >::New();
table->Initialize();
vtkSmartPointer< vtkFloatArray > xs =
vtkSmartPointer< vtkFloatArray >::New();
xs->SetName("X");
table->AddColumn(xs);
vtkSmartPointer< vtkFloatArray > ys =
vtkSmartPointer< vtkFloatArray >::New();
ys->SetName("Y");
table->AddColumn(ys);
double halfRange = ((RANGE_HIGH - RANGE_LOW) / 2.0);
table->SetNumberOfRows(3);
table->SetValue(0, 0, RANGE_LOW);
table->SetValue(0, 1, 0.5);
table->SetValue(1, 0, RANGE_LOW + halfRange);
table->SetValue(1, 1, 1.0);
table->SetValue(2, 0, RANGE_HIGH);
table->SetValue(2, 1, 0.2);
vtkSmartPointer< vtkPlotBar > plot = vtkSmartPointer< vtkPlotBar
>::New();
plot->SetInputData(table, 0, 1);
plot->GetPen()->SetLineType(vtkPen::NO_PEN);
plot->GetBrush()->SetColorF(0.0, 0.0, 0.0, 0.25);
chart->AddPlot(plot);
vtkSmartPointer<vtkPiecewiseFunction> f =
vtkSmartPointer<vtkPiecewiseFunction>::New();
f->AddPoint(RANGE_LOW, 0.2);
f->AddPoint(RANGE_LOW + halfRange, 0.5);
f->AddPoint(RANGE_HIGH, 0.9);
vtkSmartPointer< vtkPiecewiseFunctionItem > opacityFunctionItem =
vtkSmartPointer< vtkPiecewiseFunctionItem >::New();
opacityFunctionItem->SetPiecewiseFunction(f);
chart->AddPlot(opacityFunctionItem);
vtkSmartPointer< vtkPiecewiseControlPointsItem > controlPoints =
vtkSmartPointer< vtkPiecewiseControlPointsItem >::New();
controlPoints->SetPiecewiseFunction(f);
chart->AddPlot(controlPoints);
return chart;
}
int main(int, char *[])
{
vtkSmartPointer<vtkContextView> view =
vtkSmartPointer<vtkContextView>::New();
view->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
view->GetRenderWindow()->SetSize(800, 600);
view->GetScene()->AddItem(GetNewChart());
view->GetRenderWindow()->GetInteractor()->Initialize();
view->GetRenderWindow()->GetInteractor()->CreateOneShotTimer(10);
view->GetRenderWindow()->GetInteractor()->Start();
}
On 23 May 2014 05:49, Marcus D. Hanwell <marcus.hanwell at kitware.com> wrote:
> On Mon, May 19, 2014 at 8:48 PM, Andrew Ward
> <andrew.derek.ward at gmail.com> wrote:
> > Hello,
> >
> > I am attempting to use a vtkChartXY with an x-axis in the range of 32-bit
> > floating-point numbers (-3.40282e+038 to 3.40282e+038), however when
> adding
> > values with a range greater than 1e10, the chart fails to render
> properly.
> >
> > I tracked one possible problem down to vtkChart::CalculatePlotTransform,
> > where the scaling factor is altered for large ranges, which at least
> > explains why the issue appears over the 1e10 limit, but I am at a loss
> as to
> > whether this is a bug, or whether I am using the chart incorrectly.
> >
> > Any suggestions much appreciated,
> >
> I wrote most of this code, if you could supply a few lines of code to
> trigger it I will take a look. The scaling is there to support double
> precision data that needs to be plotted and it sounds like my tests
> miss a case that is hitting you here.
>
> Thanks,
>
> Marcus
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20140523/973f540a/attachment.html>
More information about the vtkusers
mailing list