def selection_problem(): """The double tetrahedron problem with selection constraints""" problem = GeometricProblem(dimension=3, use_prototype=False) # no prototype based selection 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.5, 0.5, 1.0])) problem.add_point('v5', vector([0.5, 0.5,-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(DistanceConstraint('v1', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v2', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v3', 'v5', 10.0)) #problem.add_constraint(SelectionConstraint(is_right_handed, ['v1','v2','v4','v5'])) problem.add_constraint(RightHandedConstraint('v1','v2','v4','v5')) return problem
def double_triangle(): problem = GeometricProblem(dimension=2) problem.add_point('v1', vector([0.0, 0.0])) problem.add_point('v2', vector([1.0, 0.0])) problem.add_point('v3', vector([0.0, 1.0])) problem.add_point('v4', vector([1.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('v2', 'v4', 10.0)) problem.add_constraint(DistanceConstraint('v3', 'v4', 10.0)) return problem
def line_problem_3d_3(): """A problem with a Line and a 3 CoincicentConstraints""" problem = GeometricProblem(dimension=3) problem.add_variable(Point('p1'),vector([3.0, 2.0, 1.0])) problem.add_variable(Point('p2'),vector([1.0, 1.0, 1.0])) problem.add_variable(Line('l1'),vector([0.0, 0.0, 0.0, 1.0, 1.0, 1.0])) problem.add_constraint(CoincidenceConstraint(Point('p1'), Line('l1'))) problem.add_constraint(CoincidenceConstraint(Point('p2'), Line('l1'))) problem.add_constraint(DistanceConstraint(Point('p1'), Point('p2'), 5.0)) problem.add_variable(Point('p3'),vector([0.0, 0.0, 1.0])) problem.add_constraint(CoincidenceConstraint(Point('p3'), Line('l1'))) problem.add_constraint(DistanceConstraint(Point('p1'), Point('p3'), 8.0)) return problem
def hog1(): # double triangle with inter-angle (needs angle propagation) problem = GeometricProblem(dimension=2) problem.add_point('A', vector([0.0, 0.0])) problem.add_point('B', vector([1.0, 0.0])) problem.add_point('C', vector([1.0, 1.0])) problem.add_point('D', vector([0.0, 1.0])) problem.add_constraint(DistanceConstraint('A', 'B', 10.0)) problem.add_constraint(DistanceConstraint('B', 'C', 10.0)) problem.add_constraint(DistanceConstraint('C', 'D', 10.0)) problem.add_constraint(AngleConstraint('B', 'A', 'C', math.pi / 8)) problem.add_constraint(AngleConstraint('B', 'A', 'D', math.pi / 4)) return problem
def twoscisors(): problem = GeometricProblem(dimension=2) problem.add_point('A', vector([0.0, 0.0])) problem.add_point('B', vector([0.0, 1.0])) problem.add_point('C', vector([1.0, 1.0])) problem.add_point('D', vector([2.0, 1.0])) problem.add_constraint(AngleConstraint('B', 'A', 'C', math.pi / 8)) problem.add_constraint(AngleConstraint('B', 'D', 'C', math.pi / 8)) problem.add_constraint(DistanceConstraint('A', 'B', 6.0)) problem.add_constraint(DistanceConstraint('A', 'C', 6.0)) problem.add_constraint(DistanceConstraint('D', 'B', 6.0)) problem.add_constraint(DistanceConstraint('D', 'C', 6.0)) return problem
def selection_test(): problem = GeometricProblem(dimension=3,use_prototype=False) 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.5, 0.5, 1.0])) problem.add_point('v5', vector([0.5, 0.5,-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(DistanceConstraint('v1', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v2', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v3', 'v5', 10.0)) s1 = RightHandedConstraint('v1','v2','v4','v5') # add selection con problem.add_constraint(s1) # solve solver = GeometricSolver(problem) print len(solver.get_solutions()), "solutions" # remove and add constraint print "removing selection-constraint" problem.rem_constraint(s1) # solve again print len(solver.get_solutions()), "solutions" # remove and add constraint print "re-adding selection constraint" problem.add_constraint(s1) # solve again print len(solver.get_solutions()), "solutions" # remove distance print "removing and re-adding distance v1-v5" problem.rem_constraint(problem.get_distance("v1","v5")) problem.add_constraint(DistanceConstraint('v1', 'v5', 10.0)) # solve again print len(solver.get_solutions()), "solutions"
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 buggy1(): problem = GeometricProblem(dimension=2) p0 = "P0" p1 = "P1" p2 = "P2" p3 = "P3" problem.add_point(p2, vector([4.2516273494524803, -9.510959969336783])) problem.add_point(p3, vector([0.96994030830283862, -3.6416260233938491])) problem.add_point(p0, vector([6.6635607149389386, -8.5894325593219882])) problem.add_point(p1, vector([-0.06750282559988996, 6.6760454282229134])) problem.add_constraint(AngleConstraint(p1, p3, p0, 2.38643631762)) problem.add_constraint(DistanceConstraint(p2, p0, 2.58198282856)) problem.add_constraint(AngleConstraint(p1, p0, p2, -1.52046205861)) problem.add_constraint(DistanceConstraint(p3, p1, 10.3696977989)) problem.add_constraint(AngleConstraint(p3, p0, p1, 0.440080782652)) return problem
def add_random_constraint(problem, ratio): """add a random constraint to a problem, with a given ratio angles/distances""" if random.random() < ratio: # add angle pointvars = list(problem.cg.variables()) random.shuffle(pointvars) v1 = pointvars[0] v2 = pointvars[1] v3 = pointvars[2] p1 = problem.get_point(v1) p2 = problem.get_point(v2) p3 = problem.get_point(v3) angle = angle_3p(p1, p2, p3) con = AngleConstraint(v1, v2, v3, angle) diag_print("**Add constraint:" + str(con), "drplan") problem.add_constraint(con) else: # add distance pointvars = list(problem.cg.variables()) random.shuffle(pointvars) v1 = pointvars[0] v2 = pointvars[1] p1 = problem.get_point(v1) p2 = problem.get_point(v2) dist = distance_2p(p1, p2) con = DistanceConstraint(v1, v2, dist) diag_print("**Add constraint:" + str(con), "drplan") problem.add_constraint(con) return
def solve_shape(self, layers): for layer in layers: print("Solving shape ", layer.id) pt0 = layer.named_pairs[0][0] pt1 = layer.named_pairs[1][0] pt2 = layer.named_pairs[2][0] for i, point in enumerate(layer.named_pairs): # Add initial points self.problem.add_variable(point[0], vector([point[1], point[2], 0])) # Lock them together if i > 0: self.problem.add_constraint( DistanceConstraint( pt0, point[0], distance_2p(self.problem.get_point(pt0), self.problem.get_point(point[0])))) if i > 1: self.problem.add_constraint( AngleConstraint( pt0, pt1, point[0], angle_3p(self.problem.get_point(pt0), self.problem.get_point(pt1), self.problem.get_point(point[0])))) if i > 2: self.problem.add_constraint( AngleConstraint( pt0, pt2, point[0], angle_3p(self.problem.get_point(pt0), self.problem.get_point(pt2), self.problem.get_point(point[0]))))
def balloon_problem(): """test angle propagation via balloon""" problem = GeometricProblem(dimension=2) problem.add_point('A', vector([0.0, 0.0])) problem.add_point('B', vector([1.0, -1.0])) problem.add_point('C', vector([1.0, +1.0])) problem.add_point('D', vector([2.0, 0.0])) problem.add_constraint( AngleConstraint( 'B', 'A', 'C', angle_3p(problem.get_point('B'), problem.get_point('A'), problem.get_point('C')))) problem.add_constraint( AngleConstraint( 'A', 'B', 'C', angle_3p(problem.get_point('A'), problem.get_point('B'), problem.get_point('C')))) problem.add_constraint( AngleConstraint( 'B', 'C', 'D', angle_3p(problem.get_point('B'), problem.get_point('C'), problem.get_point('D')))) problem.add_constraint( AngleConstraint( 'C', 'D', 'B', angle_3p(problem.get_point('C'), problem.get_point('D'), problem.get_point('B')))) problem.add_constraint(DistanceConstraint('A', 'D', 6.0)) return problem
def propagation_problem(): problem = GeometricProblem(dimension=2) problem.add_point('v1', vector([random.random() for i in [1, 2]])) problem.add_point('v2', vector([random.random() for i in [1, 2]])) problem.add_point('v3', vector([random.random() for i in [1, 2]])) problem.add_point('v4', vector([random.random() for i in [1, 2]])) problem.add_point('v5', vector([random.random() for i in [1, 2]])) problem.add_constraint( DistanceConstraint( 'v1', 'v2', distance_2p(problem.get_point('v1'), problem.get_point('v2')))) problem.add_constraint( DistanceConstraint( 'v1', 'v3', distance_2p(problem.get_point('v1'), problem.get_point('v3')))) problem.add_constraint( DistanceConstraint( 'v2', 'v3', distance_2p(problem.get_point('v2'), problem.get_point('v3')))) problem.add_constraint( DistanceConstraint( 'v2', 'v4', distance_2p(problem.get_point('v2'), problem.get_point('v4')))) problem.add_constraint( DistanceConstraint( 'v1', 'v5', distance_2p(problem.get_point('v1'), problem.get_point('v5')))) problem.add_constraint( AngleConstraint( 'v3', 'v1', 'v4', angle_3p(problem.get_point('v3'), problem.get_point('v1'), problem.get_point('v4')))) problem.add_constraint( AngleConstraint( 'v3', 'v2', 'v5', angle_3p(problem.get_point('v3'), problem.get_point('v2'), problem.get_point('v5')))) return problem
def hog2(): # several triangles with inter-angles (needs angle propagation) problem = GeometricProblem(dimension=2) problem.add_point('M', vector([0.0, 0.0])) problem.add_point('A', vector([0.0, 1.0])) problem.add_point('B', vector([1.0, 1.0])) problem.add_point('C', vector([2.0, 1.0])) problem.add_point('D', vector([3.0, 1.0])) problem.add_point('E', vector([4.0, 1.0])) problem.add_constraint(DistanceConstraint('A', 'M', 10.0)) problem.add_constraint(DistanceConstraint('A', 'E', 10.0)) problem.add_constraint(DistanceConstraint('B', 'E', 7.0)) problem.add_constraint(DistanceConstraint('C', 'E', 6.0)) problem.add_constraint(DistanceConstraint('D', 'E', 5.0)) problem.add_constraint(AngleConstraint('A', 'M', 'B', math.pi / 20)) problem.add_constraint(AngleConstraint('B', 'M', 'C', math.pi / 20)) problem.add_constraint(AngleConstraint('D', 'M', 'C', math.pi / 20)) problem.add_constraint(AngleConstraint('D', 'M', 'E', math.pi / 20)) return problem
def double_tetrahedron_problem(): """The double tetrahedron problem""" 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.5, 0.5, 1.0])) problem.add_point('v5', vector([0.5, 0.5,-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(DistanceConstraint('v1', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v2', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v3', 'v5', 10.0)) return problem
def balloons(): # for testing angle propagation via balloon problem = GeometricProblem(dimension=2) problem.add_point('A', vector([0.0, 0.0])) problem.add_point('B', vector([0.0, 1.0])) problem.add_point('C', vector([1.0, 1.0])) problem.add_point('D', vector([2.0, 1.0])) problem.add_constraint(AngleConstraint('B', 'A', 'C', math.pi / 8)) problem.add_constraint(AngleConstraint('A', 'B', 'C', math.pi / 8)) problem.add_constraint(AngleConstraint('B', 'C', 'D', math.pi / 8)) problem.add_constraint(AngleConstraint('C', 'D', 'B', math.pi / 8)) problem.add_constraint(DistanceConstraint('A', 'D', 6.0)) return problem
def dad_tetrahedron_problem(): """The double tetrahedron problem with an angle""" 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.5, 0.5, 1.0])) problem.add_point('v5', vector([0.5, 0.5,-1.0])) problem.add_constraint(DistanceConstraint('v1', 'v2', 10.0)) problem.add_constraint(AngleConstraint('v2', 'v1','v3', 60.0*math.pi/180.0)) problem.add_constraint(DistanceConstraint('v1', '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(DistanceConstraint('v1', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v2', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v3', 'v5', 10.0)) return problem
def random_distance_problem_3D(npoints, radius, roundoff): """creates a 3D problem with random distances""" problem = GeometricProblem(dimension=3) for i in range(npoints): # add point newvar = 'v' + str(i) newpoint = vector([ _round(random.uniform(-radius, radius), roundoff), _round(random.uniform(-radius, radius), roundoff), _round(random.uniform(-radius, radius), roundoff) ]) sellist = list(problem.cg.variables()) problem.add_point(newvar, newpoint) # add distance constraints for j in range(min(3, len(sellist))): index = random.randint(0, len(sellist) - 1) var = sellist.pop(index) point = problem.get_point(var) dist = distance_2p(point, newpoint) problem.add_constraint(DistanceConstraint(var, newvar, dist)) return problem
def overconstrained_tetra(): 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.5, 0.5, 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)) # overconstrain me! problem.add_constraint(AngleConstraint('v1', 'v2', 'v3', math.pi/3)) #problem.add_constraint(AngleConstraint('v1', 'v2', 'v3', math.pi/4)) return problem
def diamond_3d(): """creates a diamond shape with point 'v1'...'v4' in 3D with one solution""" # Following should be well-constraint, gives underconstrained (need extra rule/pattern) L=10.0 problem = GeometricProblem(dimension=3, use_prototype=False) # no prototype based selection problem.add_point('v1', vector([0.0, 0.0, 0.0])) problem.add_point('v2', vector([-5.0, 5.0, 0.0])) problem.add_point('v3', vector([5.0, 5.0, 0.0])) problem.add_point('v4', vector([0.0, 10.0, 0.0])) problem.add_constraint(DistanceConstraint('v1', 'v2', L)) problem.add_constraint(DistanceConstraint('v1', 'v3', L)) problem.add_constraint(DistanceConstraint('v2', 'v3', L)) problem.add_constraint(DistanceConstraint('v2', 'v4', L)) problem.add_constraint(DistanceConstraint('v3', 'v4', L)) # this bit of code constrains the points v1...v4 in a plane with point p above it problem.add_point('p', vector([0.0, 0.0, 1.0])) problem.add_constraint(DistanceConstraint('v1', 'p', 1.0)) problem.add_constraint(AngleConstraint('v2','v1','p', math.pi/2)) problem.add_constraint(AngleConstraint('v3','v1','p', math.pi/2)) problem.add_constraint(AngleConstraint('v4','v1','p', math.pi/2)) return problem
def double_banana_plus_one_problem(): """The double banana problem, plus one constraint (well-constrained)""" 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.5, 0.5, 1.0])) problem.add_point('v5', vector([0.5, 0.5,-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(DistanceConstraint('v1', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v2', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v3', 'v5', 10.0)) problem.add_point('w1', vector([0.0, 0.0, 0.0])) problem.add_point('w2', vector([1.0, 0.0, 0.0])) problem.add_point('w3', vector([0.0, 1.0, 0.0])) problem.add_constraint(DistanceConstraint('w1', 'w2', 10.0)) problem.add_constraint(DistanceConstraint('w1', 'w3', 10.0)) problem.add_constraint(DistanceConstraint('w2', 'w3', 10.0)) problem.add_constraint(DistanceConstraint('w1', 'v4', 10.0)) problem.add_constraint(DistanceConstraint('w2', 'v4', 10.0)) problem.add_constraint(DistanceConstraint('w3', 'v4', 10.0)) problem.add_constraint(DistanceConstraint('w1', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('w2', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('w3', 'v5', 10.0)) problem.add_constraint(DistanceConstraint('v1', 'w1', 10.0)) return problem
def triple_double_triangle(): problem = GeometricProblem(dimension=2) problem.add_point('QX', vector([0.0, 0.0])) problem.add_point('QA2', vector([1.0, 0.0])) problem.add_point('QA3', vector([0.0, 1.0])) problem.add_point('QY', vector([1.0, 1.0])) problem.add_constraint(DistanceConstraint('QX', 'QA2', 10.0)) problem.add_constraint(DistanceConstraint('QX', 'QA3', 10.0)) problem.add_constraint(DistanceConstraint('QA2', 'QA3', 10.0)) problem.add_constraint(DistanceConstraint('QA2', 'QY', 10.0)) problem.add_constraint(DistanceConstraint('QA3', 'QY', 10.0)) #problem.add_point('QX', vector([0.0, 0.0])) problem.add_point('QB2', vector([1.0, 0.0])) problem.add_point('QZ', vector([0.0, 1.0])) problem.add_point('QB4', vector([1.0, 1.0])) problem.add_constraint(DistanceConstraint('QX', 'QB2', 10.0)) problem.add_constraint(DistanceConstraint('QX', 'QZ', 10.0)) problem.add_constraint(DistanceConstraint('QB2', 'QZ', 10.0)) problem.add_constraint(DistanceConstraint('QB2', 'QB4', 10.0)) problem.add_constraint(DistanceConstraint('QZ', 'QB4', 10.0)) #problem.add_point('QY', vector([0.0, 0.0])) problem.add_point('QC2', vector([1.0, 0.0])) #problem.add_point('QZ', vector([0.0, 1.0])) problem.add_point('QC4', vector([1.0, 1.0])) problem.add_constraint(DistanceConstraint('QY', 'QC2', 10.0)) problem.add_constraint(DistanceConstraint('QY', 'QZ', 10.0)) problem.add_constraint(DistanceConstraint('QC2', 'QZ', 10.0)) problem.add_constraint(DistanceConstraint('QC2', 'QC4', 10.0)) problem.add_constraint(DistanceConstraint('QZ', 'QC4', 10.0)) return problem
def _constraint_group(problem, group, dependend, angleratio): """Add constraints to problem to constrain given group of points. Group may be optionally dependend on pair of points. Creates angle constraints with a given chance.""" diag_print( "_constraint_group(group=" + str(group.keys()) + ",dep=" + str(dependend) + ")", "geometric._constraint_group") if len(group) == 2: if dependend == None: v1 = group.keys()[0] v2 = group.keys()[1] p1 = group[v1] p2 = group[v2] dist = distance_2p(p1, p2) con = DistanceConstraint(v1, v2, dist) diag_print("**Add constraint:" + str(con), "geometric._constraint_group") problem.add_constraint(con) elif len(group) >= 3: # pick three points keys = group.keys() if dependend == None: v1 = random.choice(keys) else: v1 = dependend[0] keys.remove(v1) if dependend == None: v2 = random.choice(keys) else: v2 = dependend[1] keys.remove(v2) v3 = random.choice(keys) keys.remove(v3) # create three groups g = [{}, {}, {}] g[0][v1] = group[v1] g[0][v2] = group[v2] g[1][v1] = group[v1] g[1][v3] = group[v3] g[2][v2] = group[v2] g[2][v3] = group[v3] # distribute remaining points over groups while (len(keys) > 0): k = keys.pop() if dependend == None: i = random.randint(0, 2) else: i = random.randint(1, 2) g[i][k] = group[k] # compute facts from prototype p1 = group[v1] p2 = group[v2] p3 = group[v3] # group 0: if independend, add at least one independent group if dependend == None: _constraint_group(problem, g[0], None, angleratio) # group 1: random: angle constraint or independend group if random.random() > angleratio: _constraint_group(problem, g[1], None, angleratio) else: angle = angle_3p(p1, p2, p3) con = AngleConstraint(v1, v2, v3, angle) diag_print("**Add constraint:" + str(con), "geometric._constraint_group") problem.add_constraint(con) _constraint_group(problem, g[1], [v1, v3], angleratio) # group 2: random: angle constraint, two configuratins, or independend group if random.random() > angleratio: _constraint_group(problem, g[2], None, angleratio) elif random.random() < 0.5: angle = angle_3p(p2, p1, p3) con = AngleConstraint(v2, v1, v3, angle) diag_print("**Add constraint:" + str(con), "geometric._constraint_group") problem.add_constraint(con) _constraint_group(problem, g[2], [v2, v3], angleratio) else: angle = angle_3p(p2, p3, p1) con = AngleConstraint(v2, v3, v1, angle) diag_print("**Add constraint:" + str(con), "geometric._constraint_group") problem.add_constraint(con) _constraint_group(problem, g[2], [v2, v3], angleratio)