/** 找出多边形的中心点 */
b2Vec2 findCentroid(vector<b2Vec2> vertices) {
int verticesCount = vertices.size();
b2Vec2 c;
/** 终于找到罪魁祸首了,使用结构体的时候注意一定要初始化!!!血的教训!!! c.SetZero()等同于 c.Set(0.0f, 0.0f) */
c.SetZero();
float area = 0.0f;
float p1X = 0.0f;
float p1Y = 0.0f;
float inv3 = 1.0f/3.0f;
for(int i = 0; i < verticesCount; ++i) {
b2Vec2 p2 = vertices[i];
b2Vec2 p3 = (i+1)<verticesCount ? vertices[i+1] : vertices[0];
float e1X = p2.x - p1X;
float e1Y = p2.y - p1Y;
float e2X = p3.x - p1X;
float e2Y = p3.y - p1Y;
float D = e1X * e2Y - e1Y * e2X;
float triangleArea = 0.5f * D;
area += triangleArea;
c.x += triangleArea * inv3 * (p1X + p2.x + p3.x);
c.y += triangleArea * inv3 * (p1Y + p2.y + p3.y);
}
/**代替 box2d 做检查,我自己处理异常总比box2d报错直接导致程序不能再运行了的强~ */
if(area > FLT_EPSILON) {
c.x *=1.0f/area;
c.y *=1.0f/area;
} else {
//采取设定特殊值的方式告诉上一级这里出现状况了~
c.Set(12345.6789f,98765.4321f);
}
return c;
}
b2Vec2 findCentroid(b2Vec2 *vertices,int verticesCount) {
b2Vec2 c;
/** 终于找到罪魁祸首了,使用结构体的时候注意一定要初始化!!!血的教训!!! c.SetZero()等同于 c.Set(0.0f, 0.0f) */
c.SetZero();
float area = 0.0f;
float p1X = 0.0f;
float p1Y = 0.0f;
float inv3 = 1.0f/3.0f;
for(int i = 0; i < verticesCount; ++i) {
b2Vec2 p2 = vertices[i];
b2Vec2 p3 = (i+1)<verticesCount ? vertices[i+1] : vertices[0];
float e1X = p2.x - p1X;
float e1Y = p2.y - p1Y;
float e2X = p3.x - p1X;
float e2Y = p3.y - p1Y;
float D = e1X * e2Y - e1Y * e2X;
float triangleArea = 0.5f * D;
area += triangleArea;
c.x += triangleArea * inv3 * (p1X + p2.x + p3.x);
c.y += triangleArea * inv3 * (p1Y + p2.y + p3.y);
}
/**代替 box2d 做检查,我自己处理异常总比box2d报错直接导致程序不能再运行了的强~ */
if(area > FLT_EPSILON) {
c.x *=1.0f/area;
c.y *=1.0f/area;
} else {
//采取设定特殊值的方式告诉上一级这里出现状况了~
c.Set(12345.6789f,98765.4321f);
NSLog(@"RayCastMultipleCallback这里出问题了~");
}
return c;
}