示例#1
0
文件: 132.call.c 项目: ArchC/riscv
float funcC(float input) {
  float c=-1;
  funcD(input);
  count++;
  c++;
  return input;
} 
示例#2
0
f32 SignedDistance(const Face & faceP, const neV3 & vertQ , Face & faceM)
{
	faceM = faceP;

	f32 dot = faceP.normal.Dot(vertQ);

	faceM.k += (dot);

	return funcD(faceM);
}
示例#3
0
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;
}
示例#4
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;
}
示例#5
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 ];
	}
}
示例#6
0
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;
}