本文整理汇总了C++中Constraint::excite方法的典型用法代码示例。如果您正苦于以下问题:C++ Constraint::excite方法的具体用法?C++ Constraint::excite怎么用?C++ Constraint::excite使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Constraint
的用法示例。
在下文中一共展示了Constraint::excite方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: solve
//==============================================================================
void PGSLCPSolver::solve(ConstrainedGroup* _group)
{
// If there is no constraint, then just return true.
size_t numConstraints = _group->getNumConstraints();
if (numConstraints == 0)
return;
// Build LCP terms by aggregating them from constraints
size_t n = _group->getTotalDimension();
int nSkip = dPAD(n);
double* A = new double[n * nSkip];
double* x = new double[n];
double* b = new double[n];
double* w = new double[n];
double* lo = new double[n];
double* hi = new double[n];
int* findex = new int[n];
// Set w to 0 and findex to -1
#ifdef BUILD_TYPE_DEBUG
std::memset(A, 0.0, n * nSkip * sizeof(double));
#endif
std::memset(w, 0.0, n * sizeof(double));
std::memset(findex, -1, n * sizeof(int));
// Compute offset indices
size_t* offset = new size_t[n];
offset[0] = 0;
// std::cout << "offset[" << 0 << "]: " << offset[0] << std::endl;
for (size_t i = 1; i < numConstraints; ++i)
{
Constraint* constraint = _group->getConstraint(i - 1);
assert(constraint->getDimension() > 0);
offset[i] = offset[i - 1] + constraint->getDimension();
// std::cout << "offset[" << i << "]: " << offset[i] << std::endl;
}
// For each constraint
ConstraintInfo constInfo;
constInfo.invTimeStep = 1.0 / mTimeStep;
Constraint* constraint;
for (int i = 0; i < numConstraints; ++i)
{
constraint = _group->getConstraint(i);
constInfo.x = x + offset[i];
constInfo.lo = lo + offset[i];
constInfo.hi = hi + offset[i];
constInfo.b = b + offset[i];
constInfo.findex = findex + offset[i];
constInfo.w = w + offset[i];
// Fill vectors: lo, hi, b, w
constraint->getInformation(&constInfo);
// Fill a matrix by impulse tests: A
constraint->excite();
for (int j = 0; j < constraint->getDimension(); ++j)
{
// Adjust findex for global index
if (findex[offset[i] + j] >= 0)
findex[offset[i] + j] += offset[i];
// Apply impulse for mipulse test
constraint->applyUnitImpulse(j);
// Fill upper triangle blocks of A matrix
int index = nSkip * (offset[i] + j) + offset[i];
constraint->getVelocityChange(A + index, true);
for (int k = i + 1; k < numConstraints; ++k)
{
index = nSkip * (offset[i] + j) + offset[k];
_group->getConstraint(k)->getVelocityChange(A + index, false);
}
// Filling symmetric part of A matrix
for (int k = 0; k < i; ++k)
{
for (int l = 0; l < _group->getConstraint(k)->getDimension(); ++l)
{
int index1 = nSkip * (offset[i] + j) + offset[k] + l;
int index2 = nSkip * (offset[k] + l) + offset[i] + j;
A[index1] = A[index2];
}
}
}
assert(isSymmetric(n, A, offset[i],
offset[i] + constraint->getDimension() - 1));
constraint->unexcite();
}
assert(isSymmetric(n, A));
// Print LCP formulation
// dtdbg << "Before solve:" << std::endl;
// print(n, A, x, lo, hi, b, w, findex);
//.........这里部分代码省略.........