Corrected FixConstraint bug: now just one or two fixed points

will also translate and/or rotatate the solution.
This commit is contained in:
kwikrick 2009-10-06 16:33:16 +00:00
parent e361ef14d0
commit fe8d04497f
2 changed files with 43 additions and 7 deletions

View File

@ -416,8 +416,8 @@ class GeometricSolver (Listener):
if self.fixcluster != None:
self.dr.remove(self.fixcluster)
self.fixvars.append(con.variables()[0])
#if len(self.fixvars) >= 1:
if len(self.fixvars) >= self.problem.dimension:
if len(self.fixvars) >= 1:
#if len(self.fixvars) >= self.problem.dimension:
self.fixcluster = Rigid(self.fixvars)
self.dr.add(self.fixcluster)
self.dr.set_root(self.fixcluster)
@ -434,7 +434,8 @@ class GeometricSolver (Listener):
var = con.variables()[0]
if var in self.fixvars:
self.fixvars.remove(var)
if len(self.fixvars) < self.problem.dimension:
#if len(self.fixvars) < self.problem.dimension:
if len(self.fixvars) == 0:
self.fixcluster = None
else:
self.fixcluster = Rigid(self.fixvars)

View File

@ -10,7 +10,7 @@ from time import time
# ---------- 3D problems -----
def fix_problem_3d():
def fix3_problem_3d():
"""A problem with a fix constraint"""
problem = GeometricProblem(dimension=3)
problem.add_point('v1', vector([0.0, 0.0, 0.0]))
@ -23,13 +23,46 @@ def fix_problem_3d():
problem.add_constraint(DistanceConstraint('v1', 'v4', 10.0))
problem.add_constraint(DistanceConstraint('v2', 'v4', 10.0))
problem.add_constraint(DistanceConstraint('v3', 'v4', 10.0))
problem.add_constraint(FixConstraint('v1', vector([0.0,0.0,0.0])))
problem.add_constraint(FixConstraint('v2', vector([10.0,0.0,0.0])))
problem.add_constraint(FixConstraint('v3', vector([5.0,5.0,0.0])))
return problem
def fix2_problem_3d():
"""A problem with a fix constraint"""
problem = GeometricProblem(dimension=3)
problem.add_point('v1', vector([0.0, 0.0, 0.0]))
problem.add_point('v2', vector([1.0, 0.0, 0.0]))
problem.add_point('v3', vector([0.0, 1.0, 0.0]))
problem.add_point('v4', vector([0.0, 0.0, 1.0]))
#problem.add_constraint(DistanceConstraint('v1', 'v2', 10.0))
problem.add_constraint(DistanceConstraint('v1', 'v3', 10.0))
problem.add_constraint(DistanceConstraint('v2', 'v3', 10.0))
problem.add_constraint(DistanceConstraint('v1', 'v4', 10.0))
problem.add_constraint(DistanceConstraint('v2', 'v4', 10.0))
problem.add_constraint(DistanceConstraint('v3', 'v4', 10.0))
problem.add_constraint(FixConstraint('v1', vector([0.0,0.0,0.0])))
problem.add_constraint(FixConstraint('v2', vector([10.0,0.0,0.0])))
return problem
def fix1_problem_3d():
"""A problem with a fix constraint"""
problem = GeometricProblem(dimension=3)
problem.add_point('v1', vector([0.0, 0.0, 0.0]))
problem.add_point('v2', vector([1.0, 0.0, 0.0]))
problem.add_point('v3', vector([0.0, 1.0, 0.0]))
problem.add_point('v4', vector([0.0, 0.0, 1.0]))
problem.add_constraint(DistanceConstraint('v1', 'v2', 10.0))
problem.add_constraint(DistanceConstraint('v1', 'v3', 10.0))
problem.add_constraint(DistanceConstraint('v2', 'v3', 10.0))
problem.add_constraint(DistanceConstraint('v1', 'v4', 10.0))
problem.add_constraint(DistanceConstraint('v2', 'v4', 10.0))
problem.add_constraint(DistanceConstraint('v3', 'v4', 10.0))
problem.add_constraint(FixConstraint('v1', vector([0.0,0.0,0.0])))
return problem
def double_banana_problem():
"""The double tetrahedron problem"""
problem = GeometricProblem(dimension=3)
@ -778,6 +811,8 @@ def runtests():
#test(ada_tetrahedron_problem())
#test(random_triangular_problem_3D(10,10.0,0.0,0.5))
#test(random_distance_problem_3D(10,1.0,0.0))
test(fix_problem_3d())
#test(fix1_problem_3d())
#test(fix2_problem_3d())
test(fix3_problem_3d())
if __name__ == "__main__": runtests()