找出多边形的中心点

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

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;

}

在MATLAB中,计算多边形的最大内接圆通常涉及到几何形状分析,特别是找到一个多边形中心点到其各顶点距离中的最小值,这个最小值对应的半径即为其内切圆的半径。以下是一个简单的步骤: 1. **创建或导入多边形**: 首先,你需要有一个表示多边形的顶点数据。这可以是二维数组,其中每个行代表一个顶点的坐标。 ```matlab vertices = [x1 y1; x2 y2; ...; xn yn]; % 用(x,y)替换实际坐标 ``` 2. **计算各边长度**:对于多边形的每条边,通过两点间距离公式(`sqrt((xi-xj)^2 + (yi-yj)^2)`)计算出长度。 3. **找出最短边**:找出所有邻边中最短的一对,它们共同决定了一个角以及该角内切圆的直径。 4. **求内切圆半径**:内切圆的半径等于最短边长度除以2。 5. **确定内切圆中心**:多边形中心通常是它的质心,可以通过将所有顶点的横纵坐标的平均值得到。 如果你想要编写一个完整的函数来处理这个问题,你可以参考以下伪代码: ```matlab function [radius, center] = maxInnerCircle(vertices) % 计算各个边长 edges = sqrt(diff(vertices).^2); % 找到最短边 min_edge_index = find(edges == min(edges)); % 内切圆半径 radius = edges(min_edge_index) / 2; % 计算质心作为内切圆中心 center = mean(vertices, 'all'); end ``` 然后,调用这个函数并传入你的多边形顶点: ```matlab [radius, center] = maxInnerCircle(vertices); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值