[vtkusers] vtkTransform problem: really roundoff error?

Michele Conconi michele.conconi at unibo.it
Mon Feb 8 10:45:28 EST 2010


Hi again.
I'm sorry, I probably did not explain my problem in the best way.
I do not think that it is a round off error. Indeed, what I'm doing is 
not reading the output after a bing number of inversion. Instead, I set 
the transformation matrix to some values, invert it many times, than I 
reset the matrix into my check configuration and see if the output still 
corresponds with what I impose. So the problem seems to be that by 
inverting the vktTransofrm enough times, it "obeys" no more, i.e. it 
goes no more where it should.

As both David and Murat suggested, I also thought at the beginning that 
the problem was caused by some roundoff error. So, to compensateit, I  
reset the matrix of my transformation to the identity before any change. 
I also performed my checks introducing some tolerance as you may see in 
the new code below. Unfortunately, with epsilon up to 1.5 I  obtain the 
same problem. The filter change its behavior always after the same 
number of cycle (214 for your knowledge). Also, the error I obtain is 
not of the dimension of a roundoff error. Indeed, at the failure the 
center of the polydata is

x = -0.0438237 , y =0.0876474 , z = -4.98359  instead of  x = 9.95618,  
y = -23.462, z = 26.4141

and the matrix is the identity instead of

1   0   0   10
0    0.707107   0.707107   -20
0   -0.707107   0.707107   30
0   0   0   1

Where could be the problem?
Michele

#include "vtkTransformPolyDataFilter.h"
#include "vtkSTLReader.h"
#include "vtkTransform.h"
#include <iostream>


using namespace std;


int main(int argc, char *argv[])
{
    double center[]={0,0,0};
    double c[]={0,0,0};

    vtkSTLReader *volumeReader = vtkSTLReader::New();
    vtkTransformPolyDataFilter *TF = vtkTransformPolyDataFilter::New();
    vtkTransform *ActualPosition = vtkTransform::New();
    vtkPolyData *poly = vtkPolyData::New();

    volumeReader->SetFileName("cube.stl");
    TF->SetInput(volumeReader->GetOutput());
    volumeReader->Delete();

    TF->SetTransform(ActualPosition);
    poly=TF->GetOutput();

    poly->GetCenter(center);
    cout<<center[0]<<" "<<center[1]<<" "<<center[2]<<endl;//the center 
of the cube containing the polydata in its ZERO configuration, i.e. no 
rotation or translation

    ActualPosition->Identity();
    ActualPosition->PostMultiply();
    ActualPosition->RotateX(-45);
    ActualPosition->Translate(10,-20,30);
    poly->Update();

    poly->GetCenter(center);
    cout<<center[0]<<" "<<center[1]<<" "<<center[2]<<endl;//the center 
of the cube containing the polydata in the control configuration  
configuration
    ActualPosition->Print(cout);
   
    int i=0;
    while(i<200000)
    {
        //modify the vtkTransform
        ActualPosition->Identity();
        ActualPosition->PostMultiply();
        ActualPosition->RotateX(0);
        ActualPosition->Translate(0,0,0);
        poly->Update();

        for (int j=0; j<1e7; j++)
        {
            ActualPosition->Inverse();
            //my operations...
            ActualPosition->Inverse();
        }


        if(i%10000==0)
            cout<<i<<endl;

        //bring it back to the control configuration
        ActualPosition->Identity();
        ActualPosition->PostMultiply();
        ActualPosition->RotateX(-45);
        ActualPosition->Translate(10,-20,30);
        poly->Update();


        poly->GetCenter(c);
        //check if the center of the cube containing the polydata is 
still in the right position
        double epsilon=1.5;
        if(abs(c[0]-center[0])<epsilon && abs(c[1]-center[1])<epsilon && 
abs(c[2]-center[2])<epsilon)
            i++;
        else
        {
            cout<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
            cout<<i<<endl;
            ActualPosition->Print(cout);
            i=2000000;
        }
    }

    ActualPosition->Delete();
    TF->Delete();
}
-- 
* Eng. Michele Conconi*
Ph.D. student
DIEM - Dept. of Mechanical Engineering
Alma Mater Studiorum - University of Bologna
Viale Risorgimento 2, 40136, Bologna, Italy
Email: michele.conconi at unibo.it
Website: http://www.diem.ing.unibo.it/grab
Office: (+39) 051 20 93451
Mobile: (+39) 329 0287996



* INFORMAZIONE RISERVATA E CONFIDENZIALE *
Questo messaggio contiene informazioni riservate e confidenziali.
Se il lettore non fosse il destinatario del messaggio, inoltrato e 
ricevuto per errore,
il testo dovrà essere immediatamente cancellato dal computer del ricevente.
E' assolutamente proibita qualunque circolazione, disseminazione o
copia del messaggio spedito e/o ricevuto per errore.

* CONFIDENTIALITY and WARNING NOTICE *
This message may contain legally privileged or confidential information.
If the reader is not the intended recipient, you received this message 
in error
and it should therefore be deleted from your computer at once.
Any dissemination, distribution and copying of a message
mistakenly sent or received is strictly forbidden.



More information about the vtkusers mailing list