//-------------------------------------------------------------- void ofApp::setup(){ ofEnableSmoothing(); ofBackground(0); pVec.clear(); delauMesh.clear(); for (int i = 0; i < N; i++) { pVec.push_back(ofVec2f(ofRandom(ofGetWidth()), ofRandom(ofGetHeight()))); } for(int i = 0; i < N-2; i++) { ofVec2f v1 = pVec[i]; for(int j = i+1; j < N-1; j++) { ofVec2f v2 = pVec[j]; for(int k = j+1; k < N; k++) { ofVec2f v3 = pVec[k]; float tmp = 2.0*((v2.x-v1.x)*(v3.y-v1.y)-(v2.y-v1.y)*(v3.x-v1.x)); ofVec2f center = ofVec2f( ((v3.y-v1.y)*(v2.x*v2.x-v1.x*v1.x+v2.y*v2.y-v1.y*v1.y)+ (v1.y-v2.y)*(v3.x*v3.x-v1.x*v1.x+v3.y*v3.y-v1.y*v1.y))/tmp, ((v1.x-v3.x)*(v2.x*v2.x-v1.x*v1.x+v2.y*v2.y-v1.y*v1.y)+ (v2.x-v1.x)*(v3.x*v3.x-v1.x*v1.x+v3.y*v3.y-v1.y*v1.y))/tmp ); float r = ofDist(center.x,center.y, v1.x,v1.y) - 0.01; Boolean flg = false; for (int l = 0; l < N; l++) { if (ofDist(center.x,center.y, pVec[l].x,pVec[l].y) < r) { flg = true; break; } } ofFloatColor c = ofFloatColor( ofRandom(0.0,1.0), ofRandom(0.0,1.0), ofRandom(0.0,1.0) ); if (!flg) { //ofDrawLine(v1.x, v1.y, v2.x, v2.y); //ofDrawLine(v2.x, v2.y, v3.x, v3.y); //ofDrawLine(v3.x, v3.y, v1.x, v1.y); delauMesh.addVertex(v1); delauMesh.addColor(c); delauMesh.addVertex(v2); delauMesh.addColor(c); delauMesh.addVertex(v3); delauMesh.addColor(c); } } } } }
void getCellMesh(voro::voronoicell &_c, ofPoint _pos, ofVboMesh& _mesh, bool bWireframe){ if( _c.p ) { if( !bWireframe ) { // Extract Verteces // ofVboMesh mesh; mesh.setMode(OF_PRIMITIVE_TRIANGLES ); mesh.addVertices(getCellVerteces(_c, _pos)); // Add triangles using Indeces // int k,l,m,n; for(int i = 1; i < _c.p; i++){ for(int j = 0; j < _c.nu[i]; j++) { k = _c.ed[i][j]; if( k >= 0 ) { _c.ed[i][j]=-1-k; l = _c.cycle_up( _c.ed[i][ _c.nu[i]+j], k); m = _c.ed[k][l]; _c.ed[k][l]=-1-m; while(m!=i) { n = _c.cycle_up( _c.ed[k][ _c.nu[k]+l],m); mesh.addTriangle(i, k, m); k=m; l=n; m=_c.ed[k][l]; _c.ed[k][l]=-1-m; } } } } // Calculate Normals // _mesh.setMode(OF_PRIMITIVE_TRIANGLES); vector<ofMeshFace> faces = mesh.getUniqueFaces(); for (int i = 0; i < faces.size(); i++) { ofMeshFace face = faces[i]; ofPoint a = face.getVertex(0); ofPoint b = face.getVertex(1); ofPoint c = face.getVertex(2); ofPoint normal = ((b - a).cross(c - a)).normalize() * -1.; _mesh.addVertex(a); _mesh.addNormal(normal); _mesh.addVertex(b); _mesh.addNormal(normal); _mesh.addVertex(c); _mesh.addNormal(normal); // add texture coordinates if( i % 2 == 0) { _mesh.addTexCoord(ofVec2f(0.0, 0.0)); _mesh.addTexCoord(ofVec2f(0.0, 1.0)); _mesh.addTexCoord(ofVec2f(1.0, 0.0)); } else { _mesh.addTexCoord(ofVec2f(1.0, 0.0)); _mesh.addTexCoord(ofVec2f(0.0, 1.0)); _mesh.addTexCoord(ofVec2f(1.0, 1.0)); } } } else { // wireframe _mesh.setMode(OF_PRIMITIVE_LINES); _mesh.addVertices(getCellVerteces(_c, _pos)); for(int i = 1; i < _c.p; i++){ for(int j = 0; j < _c.nu[i]; j++) { int k = _c.ed[i][j]; if( k >= 0 ) { _mesh.addIndex(i); _mesh.addIndex(k); } } } } } }
// Mesh reference must be passed in void testApp::addFace(ofVboMesh& vboMesh, ofVec3f top, ofVec3f left, ofVec3f right) { vboMesh.addVertex(top); vboMesh.addVertex(left); vboMesh.addVertex(right); }