class CJoint2{ public: CVertex2 *vertex[4]; bool connect[4]; bool disconnected; int sn( int i ){ return i < 2 ? i : 5-i; } CJoint2(){ for( int i=0; i<4; i++ ) this->vertex[i] = NULL; disconnected = false; } int constructConnect(){ int connectCount = 0; for( int i=0; i<4; i++ ) if( connect[i] = vertex[sn(i)] && vertex[sn((i+1)%4)] ) connectCount++; return connectCount; } int disconnect( double threshold ); void adjustAcceleration(); void adjustAcceleration(int i1, int i2); void adjustAcceleration2(); bool ifConnectAll(){ return int(ifConnect(0))+int(ifConnect(1))+int(ifConnect(2))+int(ifConnect(3)) >= 3; } bool ifConnect(int i, int j){ return ifConnect(i) && ifConnect(j); } bool ifConnect(int i){ return vertex[sn(i)] && vertex[sn((i+1)%4)] && connect[i]; } }; class CJoint{ public: CVertex *vertex[8]; bool connect[12]; bool disconnected; int sn1( int i ){ return i<4 ? i*2 : i<8 ? (i-4)*4%7 : i-8; } int sn2( int i ){ return i<4 ? i*2+1 : i<8 ? (i-4)*4%7+2 : i-4; } CJoint(){ int i; for( i=0; i<8; i++ ) this->vertex[i] = NULL; disconnected = false; } int constructConnect(){ int connectCount = 0; for( int i=0; i<12; i++ ) if( connect[i] = vertex[sn1(i)] && vertex[sn2(i)] ) connectCount++; return connectCount; } int disconnect( double threshold ); bool teared(CVertex *v1, CVertex *v2, double threshold ){ if(v1==NULL || v2==NULL ) return false; ogVector a = v1->acceleration - v2->acceleration; return a.abs2() > threshold*threshold; } void adjustAcceleration(); bool ifConnectAll(){ return int(ifConnect(0))+int(ifConnect(1))+int(ifConnect(2))+int(ifConnect(3)) >= 3; } bool ifConnect(int i, int j){ return ifConnect(i) && ifConnect(j); } bool ifConnect(int i){ return vertex[sn1(i)] && vertex[sn2(i)] && connect[i]; } }; int CJoint2::disconnect( double threshold ){ for( int i=0; i<4; i++ ){ if( this->ifConnect(i) && vertex[sn(i)] && vertex[sn((i+1)%4)] && vertex[sn(i)] != vertex[sn((i+1)%4)] ){ // if( this->ifConnect(i) && vertex[sn(i)] && vertex[sn((i+1)%4)] ){ ogVector2 a = vertex[sn(i)]->acceleration - vertex[sn((i+1)%4)]->acceleration; if( a.abs2() > threshold*threshold ){ connect[i] = false; disconnected = true; } } //if(disconnected) printf("%d ",connect[i] ); } //if(disconnected) printf("\n" ); return disconnected; } int CJoint::disconnect( double threshold ){ if(disconnected) return disconnected; if(teared(vertex[0],vertex[1],threshold)||teared(vertex[2],vertex[3],threshold)||teared(vertex[0],vertex[2],threshold)||teared(vertex[1],vertex[3],threshold) || teared(vertex[4],vertex[5],threshold)||teared(vertex[6],vertex[7],threshold)||teared(vertex[4],vertex[6],threshold)||teared(vertex[5],vertex[7],threshold) || teared(vertex[0],vertex[4],threshold)||teared(vertex[1],vertex[5],threshold)||teared(vertex[2],vertex[6],threshold)||teared(vertex[3],vertex[7],threshold) ){ disconnected = true; } return disconnected; } void CJoint2::adjustAcceleration(){ if( disconnected ) return; ogVector2 acceleration(0.0, 0.0); int count = 0; int i; for( i=0; i<4; i++ ){ if( vertex[sn(i%4)] ){ acceleration += vertex[sn(i%4)]->acceleration; count ++; } } acceleration /= count; for( i=0; i<4; i++ ) if( vertex[sn(i%4)] ) vertex[sn(i%4)]->acceleration = acceleration; } void CJoint::adjustAcceleration(){ if( disconnected ) return; ogVector acceleration(0.0, 0.0,0.0); int count = 0; int i; for( i=0; i<8; i++ ){ if( vertex[i] ){ acceleration += vertex[i]->acceleration; count ++; } } acceleration /= count; for( i=0; i<8; i++ ) if( vertex[i] ) vertex[i]->acceleration = acceleration; } void CJoint2::adjustAcceleration(int i1, int i2){ ogVector2 acceleration(0.0, 0.0); int count = 0; int i; for( i=i1; i<=i2; i++ ){ if( vertex[sn(i%4)] != vertex[sn((i+3)%4)]){ acceleration += vertex[sn(i%4)]->acceleration; count++; } } acceleration /= count; for( i=i1; i<=i2; i++ ) vertex[sn(i%4)]->acceleration = acceleration; } void CJoint2::adjustAcceleration2(){ if( this->ifConnectAll() ){ this->adjustAcceleration( 0, 3 ); return; } int i; for(i=0; i<4; i++){ if( this->ifConnect(i,(i+1)%4) ){ this->adjustAcceleration( i, i+2 ); return; } } for(i=0; i<4; i++) if( this->ifConnect(i) ) this->adjustAcceleration( i, i+1 ); }