当前位置: 首页>>代码示例>>C++>>正文


C++ StateVector::velocity方法代码示例

本文整理汇总了C++中StateVector::velocity方法的典型用法代码示例。如果您正苦于以下问题:C++ StateVector::velocity方法的具体用法?C++ StateVector::velocity怎么用?C++ StateVector::velocity使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在StateVector的用法示例。


在下文中一共展示了StateVector::velocity方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: Identity

/** Get the orientation of the frame at the specified time. The frame's orientation
  * is undefined whenever one or more of the following is true:
  *  - the state of either the primary or secondary object is undefined
  *  - the positions of the primary and secondary object are identical
  *  - the secondary is stationary with respect to the primary
  *  - the position and velocity vectors are exactly aligned
  */
Quaterniond
TwoBodyRotatingFrame::orientation(double t) const
{
    StateVector state = m_secondary->state(t) - m_primary->state(t);
    if (state.position().isZero() || state.velocity().isZero())
    {
        return Quaterniond::Identity();
    }

    // Compute the axes of the two body rotating frame,
    // convert this to a matrix, then derive a quaternion
    // from this matrix.

    // x-axis points in direction from the primary to the secondary
    Vector3d xAxis = state.position().normalized();
    Vector3d v = state.velocity().normalized();

    Vector3d zAxis;
    if (m_velocityAlligned) {
        // z-axis normal to both the x-axis and the velocity vector
        zAxis = xAxis.cross(v);
        if (zAxis.isZero())
        {
            return Quaterniond::Identity();
        }
    }
    else {
        // z-axis normal to both the x-axis and the z axis of the primary
        zAxis = xAxis.cross(m_primary->orientation(t) * Vector3d::UnitX());
        if (zAxis.isZero())
        {
            return Quaterniond::Identity();
        }
    }

    zAxis.normalize();
    Vector3d yAxis = zAxis.cross(xAxis);

    Matrix3d m;
    m << xAxis, yAxis, zAxis;

    return Quaterniond(m);
}
开发者ID:DrDrake,项目名称:cosmographia,代码行数:50,代码来源:TwoBodyRotatingFrame.cpp

示例2:

/** Get the angular velocity of the two-body rotating frame. It
  * is undefined whenever:
  *  - the state of either the primary or secondary object is undefined
  *  - the positions of the primary and secondary object are identical
  */
Vector3d
TwoBodyRotatingFrame::angularVelocity(double t) const
{
    StateVector state = m_secondary->state(t) - m_primary->state(t);
    if (state.position().isZero())
    {
        return Vector3d::Zero();
    }

    return state.position().cross(state.velocity()) / state.position().squaredNorm();
}
开发者ID:DrDrake,项目名称:cosmographia,代码行数:16,代码来源:TwoBodyRotatingFrame.cpp

示例3: if

/** Calculate the state vector at the specified time (seconds since J2000 TDB).
  *
  * The input time is clamped to so that it lies within the range between
  * the first and last record.
  */
StateVector
InterpolatedStateTrajectory::state(double tdbSec) const
{
    if (!m_states.empty())
    {
        // Use state vector table
        TimeState ts;
        ts.tsec = tdbSec;
        TimeStateList::const_iterator iter = lower_bound(m_states.begin(), m_states.end(), ts, TimeStateOrdering());

        if (iter == m_states.begin())
        {
            return m_states.front().state;
        }
        else if (iter == m_states.end())
        {
            return m_states.back().state;
        }
        else
        {
            TimeState s0 = *(iter - 1);
            TimeState s1 = *iter;
            double h = s1.tsec - s0.tsec;
            double t = (tdbSec - s0.tsec) / h;


            StateVector s = cubicHermitInterpolate(s0.state.position(), s0.state.velocity() * h,
                                                   s1.state.position(), s1.state.velocity() * h,
                                                   t);
            return StateVector(s.position(), s.velocity() / h);
        }
    }
    else if (!m_positions.empty())
    {
        // Use position table

        TimePosition ts;
        ts.tsec = tdbSec;
        TimePositionList::const_iterator iter = lower_bound(m_positions.begin(), m_positions.end(), ts, TimePositionOrdering());

        if (iter == m_positions.begin())
        {
            Vector3d velocity = estimateVelocity(m_positions, 0);
            return StateVector(m_positions.front().position, velocity);
        }
        else if (iter == m_positions.end())
        {
            Vector3d velocity = estimateVelocity(m_positions, m_positions.size() - 1);
            return StateVector(m_positions.back().position, velocity);
        }
        else
        {
            TimePosition s0 = *(iter - 1);
            TimePosition s1 = *iter;
            Vector3d v0 = estimateVelocity(m_positions, iter - m_positions.begin() - 1);
            Vector3d v1 = estimateVelocity(m_positions, iter - m_positions.begin());
            double h = s1.tsec - s0.tsec;
            double t = (tdbSec - s0.tsec) / h;

            StateVector s = cubicHermitInterpolate(s0.position, v0 * h, s1.position, v1 * h, t);
            return StateVector(s.position(), s.velocity() / h);
        }
    }
    else
    {
        return StateVector(Vector3d::Zero(), Vector3d::Zero());
    }
}
开发者ID:DrDrake,项目名称:cosmographia,代码行数:73,代码来源:InterpolatedStateTrajectory.cpp


注:本文中的StateVector::velocity方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。