Re: [eigen] Rigid Transformations in eigen: discussion thread
• To: eigen@xxxxxxxxxxxxxxxxxxx
• Subject: Re: [eigen] Rigid Transformations in eigen: discussion thread
• From: Benoit Jacob <jacob.benoit.1@xxxxxxxxx>
• Date: Fri, 18 Sep 2009 07:01:57 -0400
• Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=MZXQgt34PK8FnYCPqeWZAYscCR8jGfI8tJDAFm/48L4=; b=HfF0aQ0bYsbcpaNJR2W32uCbDd9e5xpc3bcw7NiRDe6CXibxgoQ8Fk+ajIlGfFB7R2 vglt5SpeCjolD7EjHOmN0srjW3ZaRtup5TitMLJ+9tHs2gQG7mVOEQ4m3k/B0nRhHYzX bmuD7QLiDJZioB9CqBNkIIEx4RnSlOX9bdiqQ=

```2009/9/18 Gael Guennebaud <gael.guennebaud@xxxxxxxxx>:
> On Fri, Sep 18, 2009 at 7:41 AM, Rohit Garg <rpg.314@xxxxxxxxx> wrote:
>>> Yes. So if the user is OK to cope with having to call coeffs(), then
>>> he can do all what he likes, and get optimized code thanks to ET.
>>
>> But for just an interpolation, you should not have to write coeffs()
>> everywhere. :(
>>
>> Is there no other way to get ET without coeffs()?
>>
>> How about the + and the * operator return vec8 expressions, and we
>> provide only 1 assignment operator to take vec8 expression as input?
>
> Another quite simple solution is to add a second template argument
> being the type of the coeffs. By default it would be a Vector8_. For
> instance operator* would be implemented as:
>
> DualQuaternion<Scalar, CwiseUnaryOp<ei_scalar_multiple_op<Scalar>,
> CoeffsTypeOfThis> > operator*(Scalar s)
> {
>  return s * m_coeffs;
> }
>
>
> same for operator+:
>
> template<typename OtherCoeffsType>
> DualQuaternion<Scalar, CwiseBinaryOp<ei_scalar_sum_op<Scalar>,
> CoeffsTypeOfThis, OtherCoeffsType> >
> operator+(const DualQuaternion<Scalar, OtherCoeffsType>& other)
> {
>  return m_coeffs + other.m_coeffs;
> }
>
> Then you add a ctor and operator= like this:
>
> template<typename OtherCoeffsType> operator=(const
> DualQuaternion<Scalar, OtherCoeffsType>& other)
> {
>  m_coeffs = other.m_coeffs;
> }
>
>
> and you're almost done: you still have to take care to evaluate the
> coeffs if needed in the compositing operator* and similar functions.
>
> gael

One more remark: one can then remove the Scalar parameter, and deduce
it automatically from the CoeffsType as typename CoeffsType::Scalar.

Benoit

PS. Rohit, if this isn't clear, you can always in a first approach
keep the trivial operator+ returning by value and later replace, as
that is API compatible.

```

 Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/