本文整理汇总了C++中eigen::Vector3d类的典型用法代码示例。如果您正苦于以下问题:C++ Vector3d类的具体用法?C++ Vector3d怎么用?C++ Vector3d使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Vector3d类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createPointcloudFromMLS
void Task::createPointcloudFromMLS(PCLPointCloudPtr pointcloud, envire::MultiLevelSurfaceGrid* mls_grid)
{
pointcloud->clear();
float vertical_distance = (mls_grid->getScaleX() + mls_grid->getScaleY()) * 0.5;
if(vertical_distance <= 0.0)
vertical_distance = 0.1;
// create pointcloud from mls
for(size_t x=0;x<mls_grid->getCellSizeX();x++)
{
for(size_t y=0;y<mls_grid->getCellSizeY();y++)
{
for( envire::MLSGrid::iterator cit = mls_grid->beginCell(x,y); cit != mls_grid->endCell(); cit++ )
{
envire::MLSGrid::SurfacePatch p( *cit );
Eigen::Vector3d cellPosWorld = mls_grid->fromGrid(x, y, mls_grid->getEnvironment()->getRootNode());
pcl::PointXYZ point;
point.x = cellPosWorld.x();
point.y = cellPosWorld.y();
point.z = cellPosWorld.z();
if(p.isHorizontal())
{
point.z = cellPosWorld.z() + p.mean;
pointcloud->push_back(point);
}
else if(p.isVertical())
{
float min_z = (float)p.getMinZ(0);
float max_z = (float)p.getMaxZ(0);
for(float z = min_z; z <= max_z; z += vertical_distance)
{
point.z = cellPosWorld.z() + z;
pointcloud->push_back(point);
}
}
}
}
}
}
示例2:
//! Compute gravitational acceleration due to J2.
Eigen::Vector3d computeGravitationalAccelerationDueToJ2(
const Eigen::Vector3d& positionOfBodySubjectToAcceleration,
const double gravitationalParameterOfBodyExertingAcceleration,
const double equatorialRadiusOfBodyExertingAcceleration,
const double j2CoefficientOfGravityField,
const Eigen::Vector3d& positionOfBodyExertingAcceleration )
{
// Set constant values reused for optimal computation of acceleration components.
const double distanceBetweenBodies = ( positionOfBodySubjectToAcceleration
- positionOfBodyExertingAcceleration ).norm( );
const double preMultiplier = -gravitationalParameterOfBodyExertingAcceleration
/ std::pow( distanceBetweenBodies, 4.0 ) * 1.5 * j2CoefficientOfGravityField
* equatorialRadiusOfBodyExertingAcceleration
* equatorialRadiusOfBodyExertingAcceleration;
const double scaledZCoordinate = ( positionOfBodySubjectToAcceleration.z( )
- positionOfBodyExertingAcceleration.z( ) )
/ distanceBetweenBodies;
const double scaledZCoordinateSquared = scaledZCoordinate * scaledZCoordinate;
const double factorForXAndYDirections = ( 1.0 - 5.0 * scaledZCoordinateSquared )
/ distanceBetweenBodies;
// Compute components of acceleration due to J2-effect.
Eigen::Vector3d gravitationalAccelerationDueToJ2 = Eigen::Vector3d::Constant( preMultiplier );
gravitationalAccelerationDueToJ2( basic_astrodynamics::xCartesianPositionIndex )
*= ( positionOfBodySubjectToAcceleration.x( )
- positionOfBodyExertingAcceleration.x( ) ) * factorForXAndYDirections;
gravitationalAccelerationDueToJ2( basic_astrodynamics::yCartesianPositionIndex )
*= ( positionOfBodySubjectToAcceleration.y( )
- positionOfBodyExertingAcceleration.y( ) ) * factorForXAndYDirections;
gravitationalAccelerationDueToJ2( basic_astrodynamics::zCartesianPositionIndex )
*= ( 3.0 - 5.0 * scaledZCoordinateSquared ) * scaledZCoordinate;
return gravitationalAccelerationDueToJ2;
}
示例3:
double
ClosingBoundary::getLineDistance (const Eigen::Vector3d &P0, const Eigen::Vector3d &u, const Eigen::Vector3d &Q0,
const Eigen::Vector3d &v, Eigen::Vector3d &P, Eigen::Vector3d &Q)
{
Eigen::Vector3d w0 = P0 - Q0;
double a = u.dot (u);
double b = u.dot (v);
double c = v.dot (v);
double d = u.dot (w0);
double e = v.dot (w0);
double s = (b * e - c * d) / (a * c - b * b);
double t = (a * e - b * d) / (a * c - b * b);
P = P0 + u * s;
Q = Q0 + v * t;
Eigen::Vector3d wc = P - Q;
return wc.norm ();
}
示例4: getCOM
//==============================================================================
Eigen::Isometry3d State::getCOMFrame() const
{
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
// Y-axis
const Eigen::Vector3d yAxis = Eigen::Vector3d::UnitY();
// X-axis
Eigen::Vector3d pelvisXAxis = mPelvis->getTransform().linear().col(0);
const double mag = yAxis.dot(pelvisXAxis);
pelvisXAxis -= mag * yAxis;
const Eigen::Vector3d xAxis = pelvisXAxis.normalized();
// Z-axis
const Eigen::Vector3d zAxis = xAxis.cross(yAxis);
T.translation() = getCOM();
T.linear().col(0) = xAxis;
T.linear().col(1) = yAxis;
T.linear().col(2) = zAxis;
return T;
}
示例5: vision_position_estimate
void vision_position_estimate(uint64_t usec,
Eigen::Vector3d &position,
Eigen::Vector3d &rpy)
{
mavlink::common::msg::VISION_POSITION_ESTIMATE vp{};
vp.usec = usec;
// [[[cog:
// for f in "xyz":
// cog.outl("vp.%s = position.%s();" % (f, f))
// for a, b in zip("xyz", ('roll', 'pitch', 'yaw')):
// cog.outl("vp.%s = rpy.%s();" % (b, a))
// ]]]
vp.x = position.x();
vp.y = position.y();
vp.z = position.z();
vp.roll = rpy.x();
vp.pitch = rpy.y();
vp.yaw = rpy.z();
// [[[end]]] (checksum: 2048daf411780847e77f08fe5a0b9dd3)
UAS_FCU(m_uas)->send_message_ignore_drop(vp);
}
示例6:
Line::Line(const Eigen::Vector3d& direction, const Eigen::Vector3d& origin)
: direction_ (direction.normalized()), origin_(origin)
{
}
示例7: rviz_arrow
visualization_msgs::Marker rviz_arrow(const Eigen::Vector3d & arrow, const Eigen::Vector3d & arrow_origin, int id, std::string name_space )
{
Eigen::Quaternion<double> rotation;
if(arrow.norm()<0.0001)
{
rotation=Eigen::Quaternion<double>(1,0,0,0);
}
else
{
double rotation_angle=acos(arrow.normalized().dot(Eigen::Vector3d::UnitX()));
Eigen::Vector3d rotation_axis=arrow.normalized().cross(Eigen::Vector3d::UnitX()).normalized();
rotation=Eigen::AngleAxisd(-rotation_angle+PI,rotation_axis);
}
visualization_msgs::Marker marker;
marker.header.frame_id = "/base_link";
marker.header.stamp = ros::Time();
marker.id = id;
if(id==0)
{
marker.color.r = 0.0;
marker.color.g = 0.0;
marker.color.b = 1.0;
marker.ns = name_space;
}
else
{
marker.color.r = 1.0;
marker.color.g = 0.0;
marker.color.b = 0.0;
marker.ns = name_space;
}
marker.type = visualization_msgs::Marker::ARROW;
marker.action = visualization_msgs::Marker::ADD;
marker.pose.position.x = arrow_origin.x();
marker.pose.position.y = arrow_origin.y();
marker.pose.position.z = arrow_origin.z();
marker.pose.orientation.x = rotation.x();
marker.pose.orientation.y = rotation.y();
marker.pose.orientation.z = rotation.z();
marker.pose.orientation.w = rotation.w();
//std::cout <<"position:" <<marker.pose.position << std::endl;
//std::cout <<"orientation:" <<marker.pose.orientation << std::endl;
//marker.pose.orientation.x = 0;
//marker.pose.orientation.y = 0;
//marker.pose.orientation.z = 0;
//marker.pose.orientation.w = 1;
if(arrow.norm()<0.0001)
{
marker.scale.x = 0.001;
marker.scale.y = 0.001;
marker.scale.z = 0.001;
}
else
{
marker.scale.x = arrow.norm();
marker.scale.y = 0.1;
marker.scale.z = 0.1;
}
marker.color.a = 1.0;
return marker;
}
示例8: getPositionFromAss
void ArnoldAnimationPatch::getPositionFromAss(const set<Device*>& devices)
{
#ifdef USE_ARNOLD
// by default in y-up coordinate systems, the light faces -z to start with.
// The procedure here will be to grab the translation component of the arnold matrix
// (which is actually just the position of the light in 3-d space) and set the
// look at point to origin - (lookAtDir.normalized()) and the distance to 1.
for (auto d : devices) {
// bit of a hack, but don't touch quad light positions, they seem a bit odd
if (d->getType() == "quad_light")
continue;
string nodeName = d->getMetadata("Arnold Node Name");
AtNode* light = AiNodeLookUpByName(nodeName.c_str());
if (light != nullptr) {
// Get the matrix
AtMatrix m;
AiNodeGetMatrix(light, "matrix", m);
// Get the light location
Eigen::Vector3d origin(m[3][0], m[3][1], m[3][2]);
// Get the rotation matrix
Eigen::Matrix3d rot;
rot(0, 0) = m[0][0];
rot(0, 1) = m[0][1];
rot(0, 2) = m[0][2];
rot(1, 0) = m[1][0];
rot(1, 1) = m[1][1];
rot(1, 2) = m[1][2];
rot(2, 0) = m[2][0];
rot(2, 1) = m[2][1];
rot(2, 2) = m[2][2];
// rotate -z to get direction
Eigen::Vector3d z(0, 0, -1);
Eigen::Vector3d dir = z.transpose() * rot;
Eigen::Vector3d look = origin + dir.normalized();
// calculate spherical coords
Eigen::Vector3d relPos = origin - look;
double polar = acos(relPos(1) / relPos.norm()) * (180.0 / M_PI);
double azimuth = atan2(relPos(2), relPos(0)) * (180 / M_PI);
// Set params, and lock them to the values found in the file.
// If the params don't exist, just create them
if (!d->paramExists("distance"))
d->setParam("distance", new LumiverseFloat());
if (!d->paramExists("polar"))
d->setParam("polar", new LumiverseOrientation());
if (!d->paramExists("azimuth"))
d->setParam("azimuth", new LumiverseOrientation());
if (!d->paramExists("lookAtX"))
d->setParam("lookAtX", new LumiverseFloat());
if (!d->paramExists("lookAtY"))
d->setParam("lookAtY", new LumiverseFloat());
if (!d->paramExists("lookAtZ"))
d->setParam("lookAtZ", new LumiverseFloat());
d->getParam<LumiverseFloat>("distance")->setVals(1, 1, 1, 1);
d->getParam<LumiverseOrientation>("polar")->setVals((float)polar, (float)polar, (float)polar, (float)polar);
d->getParam<LumiverseOrientation>("azimuth")->setVals((float)azimuth, (float)azimuth, (float)azimuth, (float)azimuth);
d->getParam<LumiverseFloat>("lookAtX")->setVals((float)look(0), (float)look(0), (float)look(0), (float)look(0));
d->getParam<LumiverseFloat>("lookAtY")->setVals((float)look(1), (float)look(1), (float)look(1), (float)look(1));
d->getParam<LumiverseFloat>("lookAtZ")->setVals((float)look(2), (float)look(2), (float)look(2), (float)look(2));
}
}
#endif
}
示例9: computeJacobian
void Manipulator::computeJacobian(int32_t idx, Eigen::MatrixXd& J)
{
J = Eigen::MatrixXd::Zero(6, dof_);
if(idx < dof_) // Not required to consider end-effector
{
for(uint32_t i = 0; i <= idx; ++i)
{
if(link_[i]->ep) // joint_type is prismatic
{
J.block(0, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * link_[i]->tf->axis();
J.block(3, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * Eigen::Vector3d::Zero();
}
else // joint_type is revolute
{
Eigen::Matrix4d Tib;
math::calculateInverseTransformationMatrix(T_abs_[i], Tib);
Eigen::Matrix4d Cin = Tib * C_abs_[idx];
Eigen::Vector3d P = Cin.block(0, 3, 3, 1);
J.block(0, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * link_[i]->tf->axis().cross(P);
J.block(3, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * link_[i]->tf->axis();
}
}
}
else // Required to consider the offset of end-effector
{
--idx;
for(uint32_t i = 0; i <= idx; ++i)
{
if(link_[i]->ep) // joint_type is prismatic
{
J.block(0, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * link_[i]->tf->axis();
J.block(3, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * Eigen::Vector3d::Zero();
}
else // joint_type is revolute
{
Eigen::Matrix4d Tib;
math::calculateInverseTransformationMatrix(T_abs_[i], Tib);
Eigen::Matrix4d Cin = Tib * C_abs_[idx];
Eigen::Vector3d P = Cin.block(0, 3, 3, 1);
J.block(0, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * link_[i]->tf->axis().cross(P);
J.block(3, i, 3, 1) = T_abs_[i].block(0, 0, 3, 3) * link_[i]->tf->axis();
}
}
Eigen::MatrixXd J_Pne = Eigen::MatrixXd::Identity(6, 6);
Eigen::Vector3d Pne;
if(C_abs_.size() - 1 - 1 >= 0.0)
{
Pne = T_abs_[T_abs_.size() - 1].block(0, 3, 3, 1) - C_abs_[C_abs_.size() - 1 - 1].block(0, 3, 3, 1);
}
else
{
std::stringstream msg;
msg << "C_abs_.size() <= 1" << std::endl
<< "Manipulator doesn't have enough links." << std::endl;
throw ahl_utils::Exception("Manipulator::computeJacobian", msg.str());
}
Eigen::Matrix3d Pne_cross;
Pne_cross << 0.0, Pne.coeff(2), -Pne.coeff(1),
-Pne.coeff(2), 0.0, Pne.coeff(0),
Pne.coeff(1), -Pne.coeff(0), 0.0;
J_Pne.block(0, 3, 3, 3) = Pne_cross;
J = J_Pne * J;
}
}
示例10: return
float
pcl::visualization::viewScreenArea (
const Eigen::Vector3d &eye,
const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb,
const Eigen::Matrix4d &view_projection_matrix, int width, int height)
{
Eigen::Vector4d bounding_box[8];
bounding_box[0] = Eigen::Vector4d(min_bb.x (), min_bb.y (), min_bb.z (), 1.0);
bounding_box[1] = Eigen::Vector4d(max_bb.x (), min_bb.y (), min_bb.z (), 1.0);
bounding_box[2] = Eigen::Vector4d(max_bb.x (), max_bb.y (), min_bb.z (), 1.0);
bounding_box[3] = Eigen::Vector4d(min_bb.x (), max_bb.y (), min_bb.z (), 1.0);
bounding_box[4] = Eigen::Vector4d(min_bb.x (), min_bb.y (), max_bb.z (), 1.0);
bounding_box[5] = Eigen::Vector4d(max_bb.x (), min_bb.y (), max_bb.z (), 1.0);
bounding_box[6] = Eigen::Vector4d(max_bb.x (), max_bb.y (), max_bb.z (), 1.0);
bounding_box[7] = Eigen::Vector4d(min_bb.x (), max_bb.y (), max_bb.z (), 1.0);
// Compute 6-bit code to classify eye with respect to the 6 defining planes
int pos = ((eye.x () < bounding_box[0].x ()) ) // 1 = left
+ ((eye.x () > bounding_box[6].x ()) << 1) // 2 = right
+ ((eye.y () < bounding_box[0].y ()) << 2) // 4 = bottom
+ ((eye.y () > bounding_box[6].y ()) << 3) // 8 = top
+ ((eye.z () < bounding_box[0].z ()) << 4) // 16 = front
+ ((eye.z () > bounding_box[6].z ()) << 5); // 32 = back
// Look up number of vertices
int num = hull_vertex_table[pos][6];
if (num == 0)
{
return (float (width * height));
}
//return 0.0;
// cout << "eye: " << eye.x() << " " << eye.y() << " " << eye.z() << endl;
// cout << "min: " << bounding_box[0].x() << " " << bounding_box[0].y() << " " << bounding_box[0].z() << endl;
//
// cout << "pos: " << pos << " ";
// switch(pos){
// case 0: cout << "inside" << endl; break;
// case 1: cout << "left" << endl; break;
// case 2: cout << "right" << endl; break;
// case 3:
// case 4: cout << "bottom" << endl; break;
// case 5: cout << "bottom, left" << endl; break;
// case 6: cout << "bottom, right" << endl; break;
// case 7:
// case 8: cout << "top" << endl; break;
// case 9: cout << "top, left" << endl; break;
// case 10: cout << "top, right" << endl; break;
// case 11:
// case 12:
// case 13:
// case 14:
// case 15:
// case 16: cout << "front" << endl; break;
// case 17: cout << "front, left" << endl; break;
// case 18: cout << "front, right" << endl; break;
// case 19:
// case 20: cout << "front, bottom" << endl; break;
// case 21: cout << "front, bottom, left" << endl; break;
// case 22:
// case 23:
// case 24: cout << "front, top" << endl; break;
// case 25: cout << "front, top, left" << endl; break;
// case 26: cout << "front, top, right" << endl; break;
// case 27:
// case 28:
// case 29:
// case 30:
// case 31:
// case 32: cout << "back" << endl; break;
// case 33: cout << "back, left" << endl; break;
// case 34: cout << "back, right" << endl; break;
// case 35:
// case 36: cout << "back, bottom" << endl; break;
// case 37: cout << "back, bottom, left" << endl; break;
// case 38: cout << "back, bottom, right" << endl; break;
// case 39:
// case 40: cout << "back, top" << endl; break;
// case 41: cout << "back, top, left" << endl; break;
// case 42: cout << "back, top, right" << endl; break;
// }
//return -1 if inside
Eigen::Vector2d dst[8];
for (int i = 0; i < num; i++)
{
Eigen::Vector4d world_pt = bounding_box[hull_vertex_table[pos][i]];
Eigen::Vector2i screen_pt = pcl::visualization::worldToView(world_pt, view_projection_matrix, width, height);
// cout << "point[" << i << "]: " << screen_pt.x() << " " << screen_pt.y() << endl;
dst[i] = Eigen::Vector2d(screen_pt.x (), screen_pt.y ());
}
double sum = 0.0;
for (int i = 0; i < num; ++i)
{
sum += (dst[i].x () - dst[(i+1) % num].x ()) * (dst[i].y () + dst[(i+1) % num].y ());
}
return (fabsf (float (sum * 0.5f)));
//.........这里部分代码省略.........
示例11: center
int
pcl::visualization::cullFrustum (double frustum[24], const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb)
{
int result = PCL_INSIDE_FRUSTUM;
for(int i =0; i < 6; i++){
double a = frustum[(i*4)];
double b = frustum[(i*4)+1];
double c = frustum[(i*4)+2];
double d = frustum[(i*4)+3];
//cout << i << ": " << a << "x + " << b << "y + " << c << "z + " << d << endl;
// Basic VFC algorithm
Eigen::Vector3d center ((max_bb.x () - min_bb.x ()) / 2 + min_bb.x (),
(max_bb.y () - min_bb.y ()) / 2 + min_bb.y (),
(max_bb.z () - min_bb.z ()) / 2 + min_bb.z ());
Eigen::Vector3d radius (fabs (static_cast<double> (max_bb.x () - center.x ())),
fabs (static_cast<double> (max_bb.y () - center.y ())),
fabs (static_cast<double> (max_bb.z () - center.z ())));
double m = (center.x () * a) + (center.y () * b) + (center.z () * c) + d;
double n = (radius.x () * fabs(a)) + (radius.y () * fabs(b)) + (radius.z () * fabs(c));
if (m + n < 0){
result = PCL_OUTSIDE_FRUSTUM;
break;
}
if (m - n < 0)
{
result = PCL_INTERSECT_FRUSTUM;
}
}
return result;
}
示例12: toString
//==============================================================================
std::string toString(const Eigen::Vector3d& _v)
{
return boost::lexical_cast<std::string>(_v.transpose());
}
示例13: _BuildSystem
void LinearSystem::_BuildSystem(
LinearSystem* pLS,
const unsigned int& StartU,
const unsigned int& EndU,
const unsigned int& StartV,
const unsigned int& EndV
)
{
// Jacobian
Eigen::Matrix<double, 1, 6> BigJ;
Eigen::Matrix<double, 1, 6> J;
BigJ.setZero();
J.setZero();
// Errors
double e;
double SSD = 0;
double Error = 0;
unsigned int ErrorPts = 0;
for( int ii = StartV; ii < EndV; ii++ ) {
for( int jj = StartU; jj < EndU; jj++ ) {
// variables
Eigen::Vector2d Ur; // pixel position
Eigen::Vector3d Pr, Pv; // 3d point
Eigen::Vector4d Ph; // homogenized point
// check if pixel is contained in our model (i.e. has depth)
if( pLS->m_vVirtDepth[ii * pLS->m_nImgWidth + jj] == 0 ) {
continue;
}
// --------------------- first term 1x2
// evaluate 'a' = L[ Trv * Linv( Uv ) ]
// back project to virtual camera's reference frame
// this already brings points to robotics reference frame
Pv = pLS->_BackProject( jj, ii, pLS->m_vVirtDepth[ii * pLS->m_nImgWidth + jj] );
// convert to homogeneous coordinate
Ph << Pv, 1;
// transform point to reference camera's frame
// Pr = Trv * Pv
Ph = pLS->m_dTrv * Ph;
Pr = Ph.head( 3 );
// project onto reference camera
Eigen::Vector3d Lr;
Lr = pLS->_Project( Pr );
Ur = Lr.head( 2 );
Ur = Ur / Lr( 2 );
// check if point falls in camera's field of view
if( (Ur( 0 ) <= 1) || (Ur( 0 ) >= pLS->m_nImgWidth - 2) || (Ur( 1 ) <= 1)
|| (Ur( 1 ) >= pLS->m_nImgHeight - 2) ) {
continue;
}
// finite differences
float TopPix = pLS->_Interpolate( Ur( 0 ), Ur( 1 ) - 1, pLS->m_vRefImg );
float BotPix = pLS->_Interpolate( Ur( 0 ), Ur( 1 ) + 1, pLS->m_vRefImg );
float LeftPix = pLS->_Interpolate( Ur( 0 ) - 1, Ur( 1 ), pLS->m_vRefImg );
float RightPix = pLS->_Interpolate( Ur( 0 ) + 1, Ur( 1 ), pLS->m_vRefImg );
Eigen::Matrix<double, 1, 2> Term1;
Term1( 0 ) = (RightPix - LeftPix) / 2.0;
Term1( 1 ) = (BotPix - TopPix) / 2.0;
// --------------------- second term 2x3
// evaluate 'b' = Trv * Linv( Uv )
// this was already calculated for Term1
// fill matrix
// 1/c 0 -a/c^2
// 0 1/c -b/c^2
Eigen::Matrix<double, 2, 3> Term2;
double PowC = Lr( 2 ) * Lr( 2 );
Term2( 0, 0 ) = 1.0 / Lr( 2 );
Term2( 0, 1 ) = 0;
Term2( 0, 2 ) = -(Lr( 0 )) / PowC;
Term2( 1, 0 ) = 0;
Term2( 1, 1 ) = 1.0 / Lr( 2 );
Term2( 1, 2 ) = -(Lr( 1 )) / PowC;
Term2 = Term2 * pLS->m_Kr;
// --------------------- third term 3x1
// we need Pv in homogenous coordinates
Ph << Pv, 1;
Eigen::Vector4d Term3i;
// last row of Term3 is truncated since it is always 0
Eigen::Vector3d Term3;
// fill Jacobian with T generators
Term3i = pLS->m_dTrv * pLS->m_Gen[0] * Ph;
Term3 = Term3i.head( 3 );
J( 0, 0 ) = Term1 * Term2 * Term3;
//.........这里部分代码省略.........
示例14: pointSlater
inline double SlaterSet::pointSlater(SlaterSet *set, const Eigen::Vector3d &delta,
const double &dr, unsigned int slater, unsigned int indexMO,
double expZeta)
{
if (isSmall(set->m_normalized.coeffRef(slater, indexMO))) return 0.0;
double tmp = set->m_normalized.coeffRef(slater, indexMO) * expZeta;
// Radial part with effective PQNs
for (int i = 0; i < set->m_PQNs[slater]; ++i)
tmp *= dr;
switch (set->m_slaterTypes[slater]) {
case S:
break;
case PX:
tmp *= delta.x();
break;
case PY:
tmp *= delta.y();
break;
case PZ:
tmp *= delta.z();
break;
case X2: // (x^2 - y^2)r^n
tmp *= delta.x() * delta.x() - delta.y() * delta.y();
break;
case XZ: // xzr^n
tmp *= delta.x() * delta.z();
break;
case Z2: // (2z^2 - x^2 - y^2)r^n
tmp *= 2.0 * delta.z() * delta.z() - delta.x() * delta.x()
- delta.y() * delta.y();
break;
case YZ: // yzr^n
tmp *= delta.y() * delta.z();
break;
case XY: // xyr^n
tmp *= delta.x() * delta.y();
break;
default:
return 0.0;
}
return tmp;
}
示例15: Fit
float PlaneFit::Fit()
{
_bIsFitted = true;
if (CountPoints() < 3)
return FLOAT_MAX;
double sxx,sxy,sxz,syy,syz,szz,mx,my,mz;
sxx=sxy=sxz=syy=syz=szz=mx=my=mz=0.0f;
for (std::list<Base::Vector3f>::iterator it = _vPoints.begin(); it!=_vPoints.end(); ++it) {
sxx += it->x * it->x; sxy += it->x * it->y;
sxz += it->x * it->z; syy += it->y * it->y;
syz += it->y * it->z; szz += it->z * it->z;
mx += it->x; my += it->y; mz += it->z;
}
unsigned int nSize = _vPoints.size();
sxx = sxx - mx*mx/((double)nSize);
sxy = sxy - mx*my/((double)nSize);
sxz = sxz - mx*mz/((double)nSize);
syy = syy - my*my/((double)nSize);
syz = syz - my*mz/((double)nSize);
szz = szz - mz*mz/((double)nSize);
#if defined(FC_USE_BOOST)
ublas::matrix<double> A(3,3);
A(0,0) = sxx;
A(1,1) = syy;
A(2,2) = szz;
A(0,1) = sxy; A(1,0) = sxy;
A(0,2) = sxz; A(2,0) = sxz;
A(1,2) = syz; A(2,1) = syz;
namespace lapack= boost::numeric::bindings::lapack;
ublas::vector<double> eigenval(3);
int r = lapack::syev('V','U',A,eigenval,lapack::optimal_workspace());
if (r) {
}
float sigma = 0;
#elif defined(FC_USE_EIGEN)
Eigen::Matrix3d covMat = Eigen::Matrix3d::Zero();
covMat(0,0) = sxx;
covMat(1,1) = syy;
covMat(2,2) = szz;
covMat(0,1) = sxy; covMat(1,0) = sxy;
covMat(0,2) = sxz; covMat(2,0) = sxz;
covMat(1,2) = syz; covMat(2,1) = syz;
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eig(covMat);
Eigen::Vector3d u = eig.eigenvectors().col(1);
Eigen::Vector3d v = eig.eigenvectors().col(2);
Eigen::Vector3d w = eig.eigenvectors().col(0);
_vDirU.Set(u.x(), u.y(), u.z());
_vDirV.Set(v.x(), v.y(), v.z());
_vDirW.Set(w.x(), w.y(), w.z());
_vBase.Set(mx/(float)nSize, my/(float)nSize, mz/(float)nSize);
float sigma = w.dot(covMat * w);
#else
// Covariance matrix
Wm4::Matrix3<double> akMat(sxx,sxy,sxz,sxy,syy,syz,sxz,syz,szz);
Wm4::Matrix3<double> rkRot, rkDiag;
try {
akMat.EigenDecomposition(rkRot, rkDiag);
}
catch (const std::exception&) {
return FLOAT_MAX;
}
// We know the Eigenvalues are ordered
// rkDiag(0,0) <= rkDiag(1,1) <= rkDiag(2,2)
//
// points describe a line or even are identical
if (rkDiag(1,1) <= 0)
return FLOAT_MAX;
Wm4::Vector3<double> U = rkRot.GetColumn(1);
Wm4::Vector3<double> V = rkRot.GetColumn(2);
Wm4::Vector3<double> W = rkRot.GetColumn(0);
// It may happen that the result have nan values
for (int i=0; i<3; i++) {
if (boost::math::isnan(U[i]) ||
boost::math::isnan(V[i]) ||
boost::math::isnan(W[i]))
return FLOAT_MAX;
}
_vDirU.Set((float)U.X(), (float)U.Y(), (float)U.Z());
_vDirV.Set((float)V.X(), (float)V.Y(), (float)V.Z());
_vDirW.Set((float)W.X(), (float)W.Y(), (float)W.Z());
_vBase.Set((float)(mx/nSize), (float)(my/nSize), (float)(mz/nSize));
float sigma = (float)W.Dot(akMat * W);
#endif
// In case sigma is nan
if (boost::math::isnan(sigma))
return FLOAT_MAX;
// This must be caused by some round-off errors. Theoretically it's impossible
//.........这里部分代码省略.........