找出多边形的中心点

/** 找出多边形的中心点 */

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;

}

㈠ 点的基本运算 1. 平面上两点之间距离 1 2. 判断两点是否重合 1 3. 矢量叉乘 1 4. 矢量点乘 2 5. 判断点是否在线段上 2 6. 求一点饶某点旋转后的坐标 2 7. 求矢量夹角 2 ㈡ 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 4. 点到线段所在直线的距离 4 5. 点到折线集的最近距离 4 6. 判断圆是否在多边形内 5 7. 求矢量夹角余弦 5 8. 求线段之间的夹角 5 9. 判断线段是否相交 6 10.判断线段是否相交但不交在端点处 6 11.求线段所在直线的方程 6 12.求直线的斜率 7 13.求直线的倾斜角 7 14.求点关于某直线的对称点 7 15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求多边形面积 9 5. 判断多边形顶点的排列方向,方法一 10 6. 判断多边形顶点的排列方向,方法二 10 7. 射线法判断点是否在多边形内 10 8. 判断点是否在凸多边形内 11 9. 寻点集的graham算法 12 10.寻点集凸包的卷包裹法 13 11.判断线段是否在多边形内 14 12.求简单多边形的重心 15 13.求凸多边形的重心 17 14.求肯定在给定多边形内的一个点 17 15.求从多边形外一点出发到该多边形的切线 18 16.判断多边形的核是否存在 19 ㈣ 圆的基本运算 1 .点是否在圆内 20 2 .求不共线的三点所确定的圆 21 ㈤ 矩形的基本运算 1.已知矩形三点坐标,求第4点坐标 22 ㈥ 常用算法的描述 22 ㈦ 补充 1.两圆关系: 24 2.判断圆是否在矩形内: 24 3.点到平面的距离: 25 4.点是否在直线同侧: 25 5.镜面反射线: 25 6.矩形包含: 26 7.两圆交点: 27 8.两圆公共面积: 28 9. 圆和直线关系: 29 10. 内切圆: 30 11. 求切点: 31 12. 线段的左右旋: 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值