本文来自http://blog.youkuaiyun.com/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