Esempio n. 1
0
//--------------------------------------------------------------
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);
                }
            }
        }
    }
    
}
Esempio n. 2
0
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);
					}
				}
			}
		}
    }
}
Esempio n. 3
0
// 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);
}