float funcC(float input) { float c=-1; funcD(input); count++; c++; return input; }
f32 SignedDistance(const Face & faceP, const neV3 & vertQ , Face & faceM) { faceM = faceP; f32 dot = faceP.normal.Dot(vertQ); faceM.k += (dot); return funcD(faceM); }
int main(void) { /* A function wrapper to a member variable of a class */ CAnyData<int> dataA{2016}; std::function<int(CAnyData<int>&)> funcA = &CAnyData<int>::m_value; std::cout << funcA(dataA) << std::endl; /* A function wrappter to member function without parameter passing */ CAnyData<float> dataB{2016.1}; std::function<void(CAnyData<float>&)> funcB = &CAnyData<float>::print; funcB(dataB); /* A function wrappter to member function with passing a parameter */ std::function<void(CAnyData<float>&, float)> funcC = &CAnyData<float>::printAfterAdd; funcC(dataB, 0.1); /* A function wrappter to member function generated by std::bind */ std::function<void(float)> funcD = std::bind(&CAnyData<float>::printAfterAdd, &dataB, std::placeholders::_1); funcD(0.2); return 0; }
__HMATHLNGDLL__ int _solde( CDSR_VMEval *pOdeRTI, CDSRArray<CDSRReal> *pInitials, CDSRArray<CDSRReal> *pArg, CDSRMatrix<CDSRReal > *pFunc, CDSRReal rlPrec, unsigned long nMaxCount ) { unsigned long i, j, nCount; if ( pOdeRTI == 0 || pInitials == 0 || pArg == 0 || pFunc == 0 ) throw "Internal error"; pFunc->resize_matrix( pArg->size(), pInitials->size() ); CDSRReal value; CDSRReal step; CDSRReal rlError; COdeOneStepParam param( -1.0, 2.0 ); CDSRArray<CDSRReal> func( *pInitials ); CDSRArray<CDSRReal> funcD( pInitials->size(), 0.0 ); CDSRArray<CDSRReal> funcBack( pInitials->size(), 0.0 ); CDSRArray<CDSRReal> funcBackD( pInitials->size(), 0.0 ); // RunOneStep( pOdeRTI, (*pArg)[ 0 ], &func, &funcD ); for ( j = 0; j < pInitials->size(); j++ ) (*pFunc)( 0, j ) = func[ j ]; // for ( i = 1; i < pArg->size(); i++ ) { nCount = 0; step = (*pArg)[ i ] - (*pArg)[ i - 1 ]; value = (*pArg)[ i - 1 ]; while ( ((step > 0.0) ? value < (*pArg)[ i ] : value > (*pArg)[ i ]) ) { funcBack = func; funcBackD = funcD; param.setStep( step ); while ( !SoldeOneStep( pOdeRTI, value, &func, &funcD, param, rlError, rlPrec ) ) { func = funcBack; funcD = funcBackD; step *= 0.5; param.setStep( step ); } value += step; if ( rlError < rlPrec * ALMA_ODE_PREC_MUL ) step *= 2.0; nCount++; if ( nCount > nMaxCount ) { for ( j = 0; j < pInitials->size(); j++ ) (*pFunc)( i, j ) = func[ j ]; return -int(i); } } for ( j = 0; j < pInitials->size(); j++ ) (*pFunc)( i, j ) = func[ j ]; } return 0; }
__HMATHLNGDLL__ void _solde( CDSR_VMEval *pOdeRTI, CDSRArray<CDSRReal> *pInitials, CDSRArray<CDSRReal> *pArg, CDSRArray<CDSRArray<CDSRReal>*> *pFunc, CDSRArray<CDSRArray<CDSRReal>*> *pFuncD, CDSRArray<CDSRArray<CDSRReal>*> *pFuncM, CDSRReal rlPrec, unsigned long nMaxCount ) { unsigned long i, j, nCount; pFunc->resize( pInitials->size() ); if ( pFuncD ) pFuncD->resize( pInitials->size() ); if ( pFuncM ) pFuncM->resize( pInitials->size() ); for ( j = 0; j < pInitials->size(); j++ ) (*pFunc)[ j ] = new CDSRArray<CDSRReal>( pArg->size() ); if ( pFuncD ) for ( j = 0; j < pInitials->size(); j++ ) (*pFuncD)[ j ] = new CDSRArray<CDSRReal>( pArg->size() ); if ( pFuncM ) for ( j = 0; j < pInitials->size(); j++ ) (*pFuncM)[ j ] = new CDSRArray<CDSRReal>( pArg->size() ); CDSRReal rlValue; CDSRReal rlStep; CDSRReal rlError; COdeOneStepParam param( -1.0, 2.0 ); CDSRArray<CDSRReal> func( *pInitials ); CDSRArray<CDSRReal> funcD( pInitials->size(), 0.0 ); CDSRArray<CDSRReal> funcM( pInitials->size(), 0.0 ); CDSRArray<CDSRReal> funcBack( pInitials->size(), 0.0 ); CDSRArray<CDSRReal> funcBackD( pInitials->size(), 0.0 ); // RunOneStep( pOdeRTI, (*pArg)[ 0 ], &func, &funcD ); for ( j = 0; j < pInitials->size(); j++ ) (*((*pFunc)[ j ]))[ 0 ] = func[ j ]; if ( pFuncD ) for ( j = 0; j < pInitials->size(); j++ ) (*((*pFuncD)[ j ]))[ 0 ] = funcD[ j ]; if ( pFuncM ) for ( j = 0; j < pInitials->size(); j++ ) (*((*pFuncM)[ j ]))[ 0 ] = 0.0; // for ( i = 1; i < pArg->size(); i++ ) { nCount = 0; rlStep = (*pArg)[ i ] - (*pArg)[ i - 1 ]; rlValue = (*pArg)[ i - 1 ]; while ( ((rlStep > 0.0) ? rlValue < (*pArg)[ i ] : rlValue > (*pArg)[ i ]) ) { funcBack = func; funcBackD = funcD; param.setStep( rlStep ); while ( !SoldeOneStep( pOdeRTI, rlValue, &func, &funcD, param, rlError, rlPrec ) ) { func = funcBack; funcD = funcBackD; rlStep *= 0.5; param.setStep( rlStep ); } rlValue += rlStep; if ( rlError < rlPrec * ALMA_ODE_PREC_MUL ) rlStep *= 2.0; nCount++; if ( nCount > nMaxCount ) throw "Iteration counter limit exceeded"; } for ( j = 0; j < pInitials->size(); j++ ) (*((*pFunc)[ j ]))[ i ] = func[ j ]; if ( pFuncD ) for ( j = 0; j < pInitials->size(); j++ ) (*((*pFuncD)[ j ]))[ i ] = funcD[ j ]; if ( pFuncM ) for ( j = 0; j < pInitials->size(); j++ ) (*((*pFuncM)[ j ]))[ i ] = funcM[ j ]; } }
neBool SearchResult::SearchEETri(s32 flag, s32 aIndex, s32 bIndex, neBool & assigned) { assigned = false; gEdgeStack.Init(); neByte edgeIndex; if (flag == 0) //fv { // face of convex A // vertex of triangle B for (s32 i = 0; i < objA.mesh.numNeighbour; i++) // for each edge neighbour of Face aIndex { int j = 0; while ((edgeIndex = objB.mesh.VertGetEdgeNeighbour(bIndex, j)) != 0xff) { gEdgeStack.Push(objA.mesh.FaceGetEdgeNeighbour(aIndex, i), objB.mesh.VertGetEdgeNeighbour(bIndex, j)); j++; } } } else //vf { //vertex of convex A //face of triangle B s32 i = 0; //for each edge neighbour incident to Vertex aIndex while ((edgeIndex = objA.mesh.VertGetEdgeNeighbour(aIndex, i)) != 0xff) { for (s32 j = 0; j < objB.mesh.numNeighbour; j++) { gEdgeStack.Push(objA.mesh.VertGetEdgeNeighbour(aIndex, i), objB.mesh.FaceGetEdgeNeighbour(bIndex, j)); } i++; } } while (!gEdgeStack.IsEmpty()) { _num_edge_test++; s32 edgeP, edgeQ; gEdgeStack.Pop(edgeP, edgeQ); // does the edge form a face neV3 a = objA.GetWorldNormalByEdge1(edgeP); neV3 b = objA.GetWorldNormalByEdge2(edgeP); neV3 c = objB.GetWorldNormalByEdge1(edgeQ) * -1.0f; neV3 d = objB.GetWorldNormalByEdge2(edgeQ) * -1.0f; c += (TriEdgeDir[edgeQ] * 0.01f); d += (TriEdgeDir[edgeQ] * 0.01f); c.Normalize(); d.Normalize(); f32 cba = Determinant(c,b,a); f32 dba = Determinant(d,b,a); f32 prod0 = cba * dba; if (prod0 >= -1.0e-6f) { continue; } f32 adc = Determinant(a,d,c); f32 bdc = Determinant(b,d,c); f32 prod1 = adc * bdc; if (prod1 >= -1.0e-6f) { continue; } f32 prod2 = cba * bdc; if (prod2 <= 1.0e-6f) { continue; } neV3 ai, bi; neV3 naj, nbj; objA.GetWorldEdgeVerts(edgeP, ai, bi); objB.GetWorldEdgeVerts(edgeQ, naj, nbj); naj *= -1.0f; nbj *= -1.0f; neV3 ainaj = ai + naj; neV3 ainbj = ai + nbj; neV3 binaj = bi + naj; //neV3 binbj = bi + nbj; neV3 diff1 = ainaj - ainbj; neV3 diff2 = ainaj - binaj ; Face testFace; testFace.normal = diff1.Cross(diff2); f32 len = testFace.normal.Length(); if (neIsConsiderZero(len)) { continue; } testFace.normal *= (1.0f / len); testFace.k = testFace.normal.Dot(ainaj); f32 testD = funcD(testFace); if (testD >= 0) return false; if (testD <= dMax) continue; assigned = true; dMax = testD; face = testFace; indexA = edgeP; indexB = edgeQ; typeA = SearchResult::EDGE; typeB = SearchResult::EDGE; // push s32 i, j; s32 vindex; vindex = objB.mesh.EdgeGetVert1(edgeQ); i = 0; while ((j = objB.mesh.VertGetEdgeNeighbour(vindex, i)) != 0xff) { if (j != edgeQ) gEdgeStack.Push(edgeP, j); i++; } vindex = objB.mesh.EdgeGetVert2(edgeQ); i = 0; while ((j = objB.mesh.VertGetEdgeNeighbour(vindex, i)) != 0xff) { if (j != edgeQ) gEdgeStack.Push(edgeP, j); i++; } vindex = objA.mesh.EdgeGetVert1(edgeP); i = 0; while((j = objA.mesh.VertGetEdgeNeighbour(vindex, i)) != 0xff) { if (j != edgeP) gEdgeStack.Push(j, edgeQ); i++; } vindex = objA.mesh.EdgeGetVert2(edgeP); //for (i = 0; i < objA.mesh.VertGetNumEdgeNeighbour(vindex); i++) i = 0; while ((j = objA.mesh.VertGetEdgeNeighbour(vindex, i)) != 0xff) { if (j != edgeP) gEdgeStack.Push(j, edgeQ); i++; } } return true; }