[vtkusers] Re: vtkTransform again and question about transformation of a display point back to image space...
Anja Ende
anja.ende at googlemail.com
Wed Sep 27 09:05:58 EDT 2006
Ok, one thing that was clearly wrong was that I should have used the inverse
of the transform in my function.
Also, using x, y, z in the display space yields the correct result. This, I
think makes sense:
So, my mofified code looks as follows. This zooms and then transforms back
correctly. However, I still have problems with displaying my cursor when the
slice is oblique...
void Viewer2D::ImageToDisplaySpace(double x, double y, double z, double
out[4])
{
double * tp = m_transform->GetLinearInverse()->TransformPoint(x, y,
z);
out[0] = tp[0];
out[1] = tp[1];
out[2] = tp[2];
out[3] = 0.0;
// Permute the points according to the reslice axes
vtkMatrix4x4 * resliceMat = this->m_slicer->GetResliceAxes();
if (resliceMat)
{
resliceMat->Invert(resliceMat, m_indexInv);
m_indexInv->MultiplyPoint(out, out);
}
}
I am close but I have been on this fringe for days now!!
Cheers,
Anja
On 27/09/06, Anja Ende <anja.ende at googlemail.com> wrote:
>
> Hi everyone,
>
> I think every day I am getting close to a possible solution to my problem.
>
> After advise from this group, I am trying to use the vtkTransform object
> to get the display position from the image position by applying the
> transformation back to the point...
>
> So, the scenario is like this:
>
> - I am using the vtkImageReslice object to slice the volume into 3
> orthogonal axes. Also, the reslicer outputs 2D slices
> - I am using the vtkTransform object with the reslicer to apply rotations
> and scaling...
>
> So, here is the function that I thought would convert from Image to
> Display space.
>
> // x, y, z are image pixel positions...
> void Viewer2D::ImageToDisplaySpace(double x, double y, double z, double
> out[4])
> {
> vtkImageData * in = reinterpret_cast<vtkImageData
> *>(this->m_slicer->GetInput());
> in->UpdateInformation();
>
> if (in)
> {
> double origin[3];
> double spacing[3];
> in->GetOrigin(origin);
> in->GetSpacing(spacing);
>
> // convert to physical coordinates as per David's advise.
> double xt = origin[0] + spacing[0] * x;
> double yt = origin[1] + spacing[1] * y;
> double zt = origin[2] + spacing[2] * z;
>
> // Apply the transform....
> double * tp = m_transform->TransformPoint(xt, yt, zt);
>
> // Convert back...
> out[0] = (tp[0] - origin[0]) / spacing[0];
> out[1] = (tp[1] - origin[1]) / spacing[1];
> out[2] = (tp[2] - origin[2]) / spacing[2];
> out[3] = 0.0;
>
> // Permute the points according to the reslice axes
> // The positions are oin x, y, z...so make it y, z, x for
> example for the YZ slice..
> vtkMatrix4x4 * resliceMat = this->m_slicer->GetResliceAxes();
> if (resliceMat)
> {
> resliceMat->Invert(resliceMat, m_indexInv);
> m_indexInv->MultiplyPoint(out, out);
> }
> }
>
> This, does not work. I think I have to take the reslice axes and the
> reslice axes origin into account somewhere as well. For example, if I want
> to zoom the image by a factor of 2.0, I had to apply a scaling of 0.5 to
> the transformation.
>
> So, the transformation matrix looked like:
>
> 0.5 0 0 0
> 0 0.5 0 0
> 0 0 1 0
> 0 0 0 1
>
> However, transformaing a point say (100, 100, 100) had no affect... I
> would have expected it to return (200, 200, 100) as that would be the new
> position after a double scaling.
>
> So, I am clearly missing something here. Do I need to convert the points
> to a homogeneous matrix before I try to transform it?
>
> My linear algebra is not very good, so most of my work here is trial and
> error. So, if someone could also tell me how to do rotations without
> resorting to using RotateX, RotateY functions and solving it just using
> linear algebra, I would be really grateful. I do not need any code, just
> some theory or a pointer to maybe a website that explains that for newbies.
>
> Thanks for any help you might give me.
>
> Anja
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20060927/9c0d77c0/attachment.htm>
More information about the vtkusers
mailing list