Write params if system is solved as REDUNDANT_OKAY.

A system solved as REDUNDANT_OKAY is still solved correctly,
even if the UI would consider this an error, in case that
g->allowRedundant==false. So there's no reason to discard this
solution; we might find it useful if a system loses a degree of
freedom while dragging, or to avoid regeneration after redundant
constraints are allowed.

This commit also reverts commit 3ff236c, as that is not necessary
anymore.
pull/97/head
Evil-Spirit 2016-08-15 01:38:13 +07:00 committed by whitequark
parent 8e329ca2b3
commit b2092eaea9
2 changed files with 21 additions and 24 deletions

View File

@ -463,36 +463,34 @@ SolveResult System::Solve(Group *g, int *dof, List<hConstraint> *bad,
if(!rankOk) {
if(!g->allowRedundant) {
if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad);
return SolveResult::REDUNDANT_OKAY;
}
}
} else {
// This is not the full Jacobian, but any substitutions or single-eq
// solves removed one equation and one unknown, therefore no effect
// on the number of DOF.
if(dof) *dof = mat.n - mat.m;
// This is not the full Jacobian, but any substitutions or single-eq
// solves removed one equation and one unknown, therefore no effect
// on the number of DOF.
if(dof) *dof = mat.n - mat.m;
// If requested, find all the free (unbound) variables. This might be
// more than the number of degrees of freedom. Don't always do this,
// because the display would get annoying and it's slow.
for(i = 0; i < param.n; i++) {
Param *p = &(param.elem[i]);
p->free = false;
// If requested, find all the free (unbound) variables. This might be
// more than the number of degrees of freedom. Don't always do this,
// because the display would get annoying and it's slow.
for(i = 0; i < param.n; i++) {
Param *p = &(param.elem[i]);
p->free = false;
if(andFindFree) {
if(p->tag == 0) {
p->tag = VAR_DOF_TEST;
WriteJacobian(0);
EvalJacobian();
int rank = CalculateRank();
if(rank == mat.m) {
p->free = true;
if(andFindFree) {
if(p->tag == 0) {
p->tag = VAR_DOF_TEST;
WriteJacobian(0);
EvalJacobian();
int rank = CalculateRank();
if(rank == mat.m) {
p->free = true;
}
p->tag = 0;
}
p->tag = 0;
}
}
}
// System solved correctly, so write the new values back in to the
// main parameter table.
for(i = 0; i < param.n; i++) {

View File

@ -467,7 +467,6 @@ void TextWindow::ScreenAllowRedundant(int link, uint32_t v) {
Group *g = SK.GetGroup(SS.TW.shown.group);
g->allowRedundant = true;
SS.MarkGroupDirty(g->h);
SS.GenerateAll();
SS.TW.shown.screen = Screen::GROUP_INFO;