20#ifndef _ROTATION_ABOUT_FIXED_AXIS_H_
21#define _ROTATION_ABOUT_FIXED_AXIS_H_
23#include "mbsim/functions/function.h"
24#include "mbsim/utils/utils.h"
30 using B = fmatvec::Function<fmatvec::RotMat3(Arg)>;
37 void setAxisOfRotation(
const fmatvec::Vec3 &a_) { a = a_; }
38 int getArgSize()
const override {
return 1; }
39 fmatvec::RotMat3 operator()(
const Arg &q)
override {
41 const double cosq=cos(alpha);
42 const double sinq=sin(alpha);
43 const double onemcosq=1-cosq;
44 const double a0a1=a.e(0)*a.e(1);
45 const double a0a2=a.e(0)*a.e(2);
46 const double a1a2=a.e(1)*a.e(2);
47 A.e(0,0) = cosq+onemcosq*a.e(0)*a.e(0);
48 A.e(1,0) = onemcosq*a0a1+a.e(2)*sinq;
49 A.e(2,0) = onemcosq*a0a2-a.e(1)*sinq;
50 A.e(0,1) = onemcosq*a0a1-a.e(2)*sinq;
51 A.e(1,1) = cosq+onemcosq*a.e(1)*a.e(1);
52 A.e(2,1) = onemcosq*a1a2+a.e(0)*sinq;
53 A.e(0,2) = onemcosq*a0a2+a.e(1)*sinq;
54 A.e(1,2) = onemcosq*a1a2-a.e(0)*sinq;
55 A.e(2,2) = cosq+onemcosq*a.e(2)*a.e(2);
58 typename B::DRetDArg parDer(
const Arg &q)
override {
return a; }
59 typename B::DRetDArg parDerDirDer(
const Arg &qd,
const Arg &q)
override {
return typename B::DRetDArg(3); }
60 bool constParDer()
const override {
return true; }
61 const fmatvec::Vec3& getAxisOfRotation()
const {
return a; }
62 void initializeUsingXML(xercesc::DOMElement *element)
override {
63 xercesc::DOMElement *e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"axisOfRotation");
64 setAxisOfRotation(MBXMLUtils::E(e)->getText<fmatvec::Vec3>());
Definition: function.h:53
Definition: rotation_about_fixed_axis.h:29
namespace MBSim
Definition: bilateral_constraint.cc:30