inner edge消除算法

来源:互联网 发布:金山测速软件 编辑:程序博客网 时间:2024/05/16 17:16

图:


核心逻辑:

    vector<b2Vec2>* allSegments = new vector<b2Vec2>();    float multiplyFactor = PTM_RATIO * CC_CONTENT_SCALE_FACTOR();    for(BYPolygon* polygon in comp.polyList) {        if(!polygon.isPirate) {            for(int k = 0; k < polygon.verticesCount; ++ k) {                polygon.vertices[k] += cen;                polygon.vertices[k] *= multiplyFactor;            }                        glVertexPointer(2, GL_FLOAT, 0, polygon.vertices);            glColor4f(1.0f, 1.0f, 1.0f, 1.0f);            glDrawArrays(GL_TRIANGLE_FAN, 0, polygon.verticesCount);                        for(int k = 0; k < polygon.verticesCount; ++ k) {                b2Vec2 v1 = polygon.vertices[k];                b2Vec2 v2 = (k + 1) < polygon.verticesCount ? polygon.vertices[k + 1] : polygon.vertices[0];                allSegments->push_back(b2Vec2(v1.x, v1.y));                allSegments->push_back(b2Vec2(v2.x, v2.y));            }        } else {            [pirateArray addObject:polygon];        }    }        vector<b2Vec2>* uselessSegments = new vector<b2Vec2>();    for(uint i = 0; i < allSegments->size()/2; ++ i) {        b2Vec2 m = allSegments->at(i * 2);        b2Vec2 n = allSegments->at(i * 2 + 1);        for(uint j = i + 1; j < allSegments->size()/2; ++ j) {            b2Vec2 p = allSegments->at(j * 2);            b2Vec2 q = allSegments->at(j * 2 + 1);            if(m.x==q.x && m.x==q.x && m.y==q.y && m.y==q.y) {                if(n.x==p.x && n.x== p.x && n.y==p.y && n.y==p.y) {                    uselessSegments->push_back(b2Vec2(m.x, m.y));                    uselessSegments->push_back(b2Vec2(n.x, n.y));                    break;                }            }        }    }    if(uselessSegments->size() != 0) {        for(uint i = 0; i < uselessSegments->size()/2; ++ i) {            b2Vec2 m = uselessSegments->at(i * 2);            b2Vec2 n = uselessSegments->at(i * 2 + 1);            uint token = 0;            for(uint j = 0; j < allSegments->size()/2; ++ j) {                b2Vec2 p = allSegments->at(j * 2);                b2Vec2 q = allSegments->at(j * 2 + 1);                if(m.x==p.x && m.y==p.y && n.x==q.x && n.y==q.y) {                    token = j;                    vector<b2Vec2>::iterator begin = allSegments->begin();                    allSegments->erase(begin + j * 2);                    allSegments->erase(begin + j * 2);                    break;                }            }            for(uint j = token; j < allSegments->size()/2; ++ j) {                b2Vec2 p = allSegments->at(j * 2);                b2Vec2 q = allSegments->at(j * 2 + 1);                if(m.x==q.x && m.y==q.y && n.x==p.x && n.y==p.y) {                    vector<b2Vec2>::iterator begin = allSegments->begin();                    allSegments->erase(begin + j * 2);                    allSegments->erase(begin + j * 2);                    break;                }            }        }        uselessSegments->clear();    }    delete uselessSegments;        glVertexPointer(2, GL_FLOAT, 0, &allSegments->at(0));    glColor4f(0, 0, 0, 1);    glDrawArrays(GL_LINES, 0, allSegments->size());        allSegments->clear();    delete allSegments;