cocos2d-x节点(b2Distance.h)API

本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-x节点(b2Distance.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

Box2d最终调用b2Ditance方法来求得两个形状最近点之间的距离,主要用于形状的碰撞检测。使用此方法需要将两个形状转换成一个b2DistanceProxy。为了提供高内部调用的效率,在外部开始调用b2Distance方法时,内部做了一个缓冲,用来提高计算距离的效率。

///cocos2d-x-3.0alpha0/external/Box2D/Collision
//在Box2d最终调用b2Ditance方法来求得两个形状最近点之间的距离,主要用于形状的碰撞检测。使用此方法需要将两个形状转换成一个b2DistanceProxy。为了提供高内部调用的效率,在外部开始调用b2Distance方法时,内部做了一个缓冲,用来提高计算距离的效率。

#ifndef B2_DISTANCE_H
#define B2_DISTANCE_H

#include <Box2D/Common/b2Math.h>
//声明类  
class b2Shape;

// 距离代理,使用GJK算法实现
// 它封装了任何形状
struct b2DistanceProxy
{
//    构造函数,初始化信息 
    b2DistanceProxy() : m_vertices(NULL), m_count(0), m_radius(0.0f) {}
//    用给定的形状初始化代理。当使用代理时,形状必须保持在一定的范围内
//    * 参数说明: shape:形状指针变量
//    index:索引值
    void Set(const b2Shape* shape, int32 index);

//    根据指定的方向获得支撑点的索引
//    * 参数说明: d:向量的引用
//    * 返 回 值: 顶点的索引
    int32 GetSupport(const b2Vec2& d) const;
//
//    根据指定的方向获得支撑点
//    * 参数说明: d:向量的引用
//    * 返 回 值: 顶点坐标
    const b2Vec2& GetSupportVertex(const b2Vec2& d) const;

    ///获取顶点个数 
    int32 GetVertexCount() const;

    /// 根据索引获得顶点
//    用于b2Distance
    const b2Vec2& GetVertex(int32 index) const;
///顶点缓存,用于保存chain形状中的两个顶点  
    b2Vec2 m_buffer[2];
    const b2Vec2* m_vertices;         //坐标点  
    int32 m_count;                  //顶点的数量 
    float32 m_radius;         //半径  
};
//第一次调用将count置0 
///使用它预启动b2Distance
struct b2SimplexCache
{
    float32 metric;     //长度或面积
    uint16 count;       //顶点数
    uint8 indexA[3];    //shapeA上的顶点索引数组
    uint8 indexB[3];    //shapeB上的顶点索引数组
};

//  b2Distance的输入
//  在计算中你必须选择使用形状的半径
struct b2DistanceInput
{
    b2DistanceProxy proxyA;    //距离代理A
    b2DistanceProxy proxyB;    //距离代理B
    b2Transform transformA;    //转换A
    b2Transform transformB;    //转换B
    bool useRadii;             //是否使用半径
};

// b2Distance的输出  -
struct b2DistanceOutput
{
    b2Vec2 pointA;        ///< shapeA上最近的点  
    b2Vec2 pointB;        ///< shapeB上最近的点
    float32 distance;   //距离  
    int32 iterations;    ///< GJK的迭代次数  
};

//在两个形状间计算最近点。支持下面的任何组合:
//圆形、多边形、边缘形状。单纯形缓存输入/输出
//第一次调用设置b2SimplexCache.count为0
//* 参数说明: output :距离输出指针
//cache  :单纯形缓存指针
//input  :距离输入指针
void b2Distance(b2DistanceOutput* output,
                b2SimplexCache* cache,
                const b2DistanceInput* input);


//////////////////////////////////////////////////////////////////////////
//获取顶点个数
inline int32 b2DistanceProxy::GetVertexCount() const
{
    return m_count;
}
//根据索引获得顶点
inline const b2Vec2& b2DistanceProxy::GetVertex(int32 index) const
{
    b2Assert(0 <= index && index < m_count);
    return m_vertices[index];
}
//根据指定的方向获得支撑点索引,用于构建单纯形  
inline int32 b2DistanceProxy::GetSupport(const b2Vec2& d) const
{
    int32 bestIndex = 0;
     // 获取最远的点,用于产生的单纯形包含最大的空间区域  
    float32 bestValue = b2Dot(m_vertices[0], d);
        //遍历所有的顶点,获取最远点的索引  
    for (int32 i = 1; i < m_count; ++i)
    {
        float32 value = b2Dot(m_vertices[i], d);
        if (value > bestValue)
        {
            bestIndex = i;
            bestValue = value;
        }
    }
  //返回索引 
    return bestIndex;
}
//根据指定的方向向量获得支撑点,用于构建单纯形  
inline const b2Vec2& b2DistanceProxy::GetSupportVertex(const b2Vec2& d) const
{
    int32 bestIndex = 0;
    float32 bestValue = b2Dot(m_vertices[0], d);
     //遍历所有的顶点,获得远的点  
    for (int32 i = 1; i < m_count; ++i)
    {
        float32 value = b2Dot(m_vertices[i], d);
        if (value > bestValue)
        {
            bestIndex = i;
            bestValue = value;
        }
    }
 //返回顶点 
    return m_vertices[bestIndex];
}

#endif



你可能感兴趣的:(api,cocos2d,cocos2dx,cocos2d-x)