[vtkusers] positioning a cylinder

Amy Squillacote amy.squillacote at kitware.com
Mon Apr 2 08:57:56 EDT 2007


Hi Mark,

If what you're wanting is an arrow source class, that already exists in 
VTK. Take a look at vtkArrowSource: 
http://www.vtk.org/doc/release/5.0/html/a01163.html.

- Amy

Mark Wyszomierski wrote:
> Thanks Amy, and Marc. I will give it a try. My final goal is to have a
> nice arrow class where I can just do:
>
> Arrow->SetHeadPoint(x,y,z);
> Arrow->SetTailPoint(x,y,z);
>
> Doing this with a cone actor is pretty easy (set the origin and
> direction) but for the shaft(cylinder source) it is more complicated.
>
> Thanks,
> Mark
>
> On 3/31/07, Marc Cotran <marc at cotran.ca> wrote:
>> Hi Mark,
>>
>> I have a 'hard' way of doing what you are asking. The easiest way is
>> what Amy proposes, but if you definitely want a cylinder that can update
>> quickly with changes to the endpoints...
>>
>> - useablePt1 and 2 are classes (Coord) with 3 variables (x, y, z) for
>> coordinates. Although we implemented some convenience methods in Coord,
>> you could do it all with vtkMath.
>>
>> - this->transform corresponds to that of the actor made from the
>> cylinderSource
>>
>> //////////////////////////////
>>
>>    this->cylinderSource = vtkCylinderSource::New();
>>    this->cylinderSource->SetCapping(1);
>>    this->cylinderSource->SetResolution(5);
>>
>>    // find out halfway point
>>    Coord halfwayPt(
>>        (useablePt1.x() + useablePt2.x()) / 2,
>>        (useablePt1.y() + useablePt2.y()) / 2,
>>        (useablePt1.z() + useablePt2.z()) / 2);
>>
>>    double pos[4];
>>    double res[4];
>>
>>    pos[0] = halfwayPt.x();
>>    pos[1] = halfwayPt.y();
>>    pos[2] = halfwayPt.z();
>>    pos[3] = 1;
>>
>>    this->transform.getTransform()->MultiplyPoint(pos, res);
>>
>>    // we found the center point
>>
>>    Coord diff(this->pt2 - this->pt1);
>>    Coord normalized(diff.normalize());
>>
>>    double norm = diff.norm();
>>
>>    this->cachedActor->SetScale(this->radius, norm, this->radius);
>>
>>    // get cross product
>>    double cross[3];
>>    double input[3];
>>    double output[3];
>>
>>    input[0] = 0;
>>    input[1] = 1;
>>    input[2] = 0;
>>
>>    output[0] = normalized.x();
>>    output[1] = normalized.y();
>>    output[2] = normalized.z();
>>
>>    vtkMath::Cross(input, output, cross);
>>
>>    // get the angle
>>    double angle = HelperClass::getAngle(Coord(0,1,0), Coord(), 
>> normalized);
>>
>>    // start with no rotation so they don't accumulate
>>    this->cachedActor->SetOrientation(0,0,0);
>>
>>    this->cachedActor->RotateWXYZ(angle, cross[0], cross[1], cross[2]);
>>
>>    this->cachedActor->SetPosition(
>>        res[0] / res[3],
>>        res[1] / res[3],
>>        res[2] / res[3]);
>>
>> //////////////////////////////
>>
>> It is quite possible that the code can be optimized (or at least made
>> shorter). The only advantage to this method is that you don't have to
>> remap the actor when you change one or both of the endpoints. If you
>> don't care about updates, I strongly recommend the lineSource/TubeFilter
>> method (it's much simpler!!!)
>>
>> Marc
>>
>>
>> Mark Wyszomierski wrote:
>> > Hi,
>> >
>> > I have two points in VTK space, is there an easy way to construct a
>> > cylinder so that its two endpoints touch the two points? Something
>> > like:
>> >
>> > cylinder->SetEndpoint1(x,y,z);
>> > cylinder->SetEndpoint2(x,y,z);
>> >
>> > Thanks,
>> > Mark
>> > _______________________________________________
>> > This is the private VTK discussion list. Please keep messages
>> > on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>> > Follow this link to subscribe/unsubscribe:
>> > http://www.vtk.org/mailman/listinfo/vtkusers
>>
> _______________________________________________
> This is the private VTK discussion list. Please keep messages 
> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>

-- 
Amy Squillacote
Kitware, Inc.
28 Corporate Drive
Clifton Park, NY 12065
Phone: (518) 371-3971 x106




More information about the vtkusers mailing list