求取多边形矩形包围框的中心点方法

今天下午做了一下游戏功能的扩充,不料又落马了,记录一下~

/**
 * 求取多边形的中心位置(该方法是最原始版,之前因为用的少,所以没有发觉到逻辑上存在错误)~
 * Added By Bruce Yang on 2012.09.02.15.30~
 * 实践证明,这个方法的逻辑是错误的,汲取这个教训~
 */
+(b2Vec2) getPolyCenterLogicWrong0:(BYPolygon*)polygon {
    b2Vec2* vertices = polygon.vertices;
    int iVerticesCount = polygon.verticesCount;
    float xSum = 0.0f;
    float ySum = 0.0f;
    for(int i = 0; i < iVerticesCount; ++ i) {
        xSum += vertices[i].x;
        ySum += vertices[i].y;
    }
    return b2Vec2(xSum / iVerticesCount, ySum / iVerticesCount);
}


/**
 * Added on 2012.09.02.12.46~
 * 发现上面方法的错误以后,我做了一个修正,发现错误依然存在,甚至一度让我深陷泥潭~
 */
+(b2Vec2) getPolyCenterLogicWrong1:(BYPolygon*)polygon {
    b2Vec2* vertices = polygon.vertices;
    int iVerticesCount = polygon.verticesCount;
    
    float fMinX = 0, fMaxX = 0;
    float fMinY = 0, fMaxY = 0;
    for(int i = 0; i < iVerticesCount; ++ i) {
        b2Vec2 item = vertices[i];
        if(item.x < fMinX) {
            fMinX = item.x;
        } else if(item.x > fMaxX) {
            fMaxX = item.x;
        }
        
        if(item.y < fMinY) {
            fMinY = item.y;
        } else if(item.y > fMaxY) {
            fMaxY = item.y;
        }
    }
    return b2Vec2((fMinX + fMaxX) / 2.0f, (fMinY + fMaxY) / 2.0f);
}


/**
 * Added on 2012.09.02.12.46~
 * 备注:求取多边形矩形包围框的中心点的终极版方法~
 * 让我迷茫了许久啊,数学没学好脑筋就是转不灵光,哎...
 */
+(b2Vec2) getPolyCenterFixed:(BYPolygon*)polygon {
    b2Vec2* vertices = polygon.vertices;
    int iVerticesCount = polygon.verticesCount;
    
    float fMinX, fMaxX, fMinY, fMaxY;
    for(int i = 0; i < iVerticesCount; ++ i) {
        b2Vec2 item = vertices[i];
        if(i != 0) {
            if(item.x < fMinX) {
                fMinX = item.x;
            }
            if(item.x > fMaxX) {
                fMaxX = item.x;
            }
            if(item.y < fMinY) {
                fMinY = item.y;
            }
            if(item.y > fMaxY) {
                fMaxY = item.y;
            }
        } else {
            fMinX = item.x;
            fMaxX = item.x;
            fMinY = item.y;
            fMaxY = item.y;
        }
    }
    
    return b2Vec2((fMinX + fMaxX) / 2.0f, (fMinY + fMaxY) / 2.0f);
}





posted on 2012-09-02 15:39  yang3wei  阅读(774)  评论(0编辑  收藏  举报