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 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 solve_ada_3D(a, b, c, a_cab, d_ab, a_abc): """returns a list of Configurations of v1,v2,v3 such that distance v1-v2=d12 etc. v<x>: name of point variables d<xy>: numeric distance values a<xyz>: numeric angle in radians """ diag_print("solve_ada: %s %s %s %f %f %f" % (a, b, c, a_cab, d_ab, a_abc), "clmethods") p_a = vector([0.0, 0.0]) p_b = vector([d_ab, 0.0]) dir_ac = vector([math.cos(-a_cab), math.sin(-a_cab)]) dir_bc = vector([math.cos(math.pi - a_abc), math.sin(math.pi - a_abc)]) dir_ac[1] = math.fabs(dir_ac[1]) dir_bc[1] = math.fabs(dir_bc[1]) if tol_eq(math.sin(a_cab), 0.0) and tol_eq(math.sin(a_abc), 0.0): m = d_ab / 2 + math.cos(-a_cab) * d_ab - math.cos(-a_abc) * d_ab p_c = vector([m, 0.0]) # p_c = (p_a + p_b) / 2 p_a.append(0.0) p_b.append(0.0) p_c.append(0.0) map = {a: p_a, b: p_b, c: p_c} cluster = _Configuration(map) cluster.underconstrained = True rval = [cluster] else: solutions = rr_int(p_a, dir_ac, p_b, dir_bc) p_a.append(0.0) p_b.append(0.0) rval = [] for p_c in solutions: p_c.append(0.0) map = {a: p_a, b: p_b, c: p_c} rval.append(Configuration(map)) return rval
def line_problem_2d_1(): """A problem with a Line and 1 CoincicentConstraint""" problem = GeometricProblem(dimension=2) problem.add_variable(Point('p1'),vector([3.0, 2.0])) problem.add_variable(Line('l1'),vector([0.0, 0.0, 1.0, 1.0])) problem.add_constraint(CoincidenceConstraint(Point('p1'), Line('l1'))) return problem
def solve_ddd_3D(v1, v2, v3, d12, d23, d31): """returns a list of Configurations of v1,v2,v3 such that distance v1-v2=d12 etc. v<x>: name of point variables d<xy>: numeric distance values a<xyz>: numeric angle in radians """ diag_print("solve_ddd: %s %s %s %f %f %f" % (v1, v2, v3, d12, d23, d31), "clmethods") # solve in 2D p1 = vector([0.0, 0.0]) p2 = vector([d12, 0.0]) p3s = cc_int(p1, d31, p2, d23) solutions = [] # extend coords to 3D! p1.append(0.0) p2.append(0.0) for p3 in p3s: p3.append(0.0) solution = Configuration({v1: p1, v2: p2, v3: p3}) solutions.append(solution) # return only one solution (if any) if len(solutions) > 0: solutions = [solutions[0]] diag_print("solve_ddd solutions" + str(solutions), "clmethods") return solutions
def add_layers(self, layers): # # for l in layers: #Todo: check that shape actually needs constraints before defining # l = self.define_shape(l) for l in layers: straight_pairs = [] [ straight_pairs.append(x) for x in l.straight_pairs if x not in straight_pairs ] #Need at least 3 points to calculate plane if straight_pairs < 3: pass conf = {} i = 0 for p in straight_pairs: # print(p) #path4581_p1 layername = l.name + '_p' + str(i) #rigid objects print('df', layername) self.solver.add_point(layername, vector(p + [0.0])) conf[layername] = vector([0, 0, 0]) i += 1 self.solver.add_constraint(RigidConstraint(Configuration(conf)))
def ddd_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_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')))) return problem
def line_problem_3d_2(): """A problem with a Line and 2 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)) 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 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 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 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 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 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 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 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 ada_3d_problem(): problem = GeometricProblem(dimension=3) 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_constraint(DistanceConstraint('v1','v2',distance_2p(problem.get_point('v1'), problem.get_point('v2')))) problem.add_constraint(AngleConstraint('v3', 'v1', 'v2', angle_3p(problem.get_point('v3'), problem.get_point('v1'), problem.get_point('v2')) )) problem.add_constraint(AngleConstraint('v1', 'v2', 'v3', angle_3p(problem.get_point('v1'), problem.get_point('v2'), problem.get_point('v3')) )) return problem
def double_banana_problem(): """The double banana 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)) 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)) 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 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 / 4.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 transform_point(point, transform): """transform a point from from_cs to to_cs""" hpoint = Vec(point) hpoint.append(1.0) hres = transform.mmul(hpoint) res = vector(hres[1:-1]) / hres[-1] return res
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 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 random_problem_2D(numpoints, radius=10.0, roundoff=0.0, angleratio=0.5): """Generate a random problem with given number of points, a roundoff value for the prototype points, a radius for the cloud of prototype points and a ratio of angle constraints over distance constraints""" group = {} problem = GeometricProblem(dimension=2) i = 0 while i < numpoints: aname = 'p' + str(i) apoint = vector([ _round(random.uniform(-radius, radius), roundoff), _round(random.uniform(-radius, radius), roundoff) ]) unique = True for v in group: p = group[v] if tol_eq(apoint[0], p[0]) and tol_eq(apoint[1], p[1]): unique = False break if unique: problem.add_point(aname, apoint) group[aname] = apoint i = i + 1 # next _constraint_group(problem, group, None, angleratio) 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 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 test_mergehogs(): diag_select(".") problem = GeometricProblem(dimension=2) problem.add_point('x',vector([0.0, 0.0])) problem.add_point('a',vector([1.0, 0.0])) problem.add_point('b',vector([0.0, 1.0])) problem.add_point('c',vector([-1.0, 0.0])) problem.add_point('d',vector([0.0, -1.0])) problem.add_constraint(AngleConstraint('a','x','b', 30.0/180*math.pi)) problem.add_constraint(AngleConstraint('b','x','c', 30.0/180*math.pi)) problem.add_constraint(AngleConstraint('c','x','d', 30.0/180*math.pi)) solver = GeometricSolver(problem) print solver.dr for hog in solver.dr.hedgehogs(): conf = list(solver.mg.get(hog))[0] print hog print conf print problem.verify(conf.map)
def ada_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('v3', 'v1','v2', 60.0*math.pi/180.0)) problem.add_constraint(AngleConstraint('v1', 'v2','v3', 60.0*math.pi/180.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 transform(self, t): """returns a new configuration, which is this one transformed by matrix t""" newmap = {} for v in self.map: p = self.map[v] ph = Vec(p) ph.append(1.0) ph = t.mmul(ph) p = vector(ph[0:-1]) / ph[-1] newmap[v] = p return Configuration(newmap)
def solve_dad_3D(v1, v2, v3, d12, a123, d23): """returns a list of Configurations of v1,v2,v3 such that distance v1-v2=d12 etc. v<x>: name of point variables d<xy>: numeric distance values a<xyz>: numeric angle in radians """ diag_print("solve_dad: %s %s %s %f %f %f" % (v1, v2, v3, d12, a123, d23), "clmethods") p2 = vector([0.0, 0.0]) p1 = vector([d12, 0.0]) p3s = [vector([d23 * math.cos(a123), d23 * math.sin(a123)])] # extend coords to 3D! p1.append(0.0) p2.append(0.0) solutions = [] for p3 in p3s: p3.append(0.0) solution = Configuration({v1: p1, v2: p2, v3: p3}) solutions.append(solution) return solutions
def make_hcs_2d(a, b): """build a 2D homogeneus coordiate system from two vectors""" u = b - a if tol_eq(norm(u), 0.0): # 2006/6/30 return None else: u = u / norm(u) v = vector([-u[1], u[0]]) hcs = matrix_factory([[u[0], v[0], a[0]], [u[1], v[1], a[1]], [0.0, 0.0, 1.0]]) return hcs
def make_hcs_2d_scaled(a, b): """build a 2D homogeneus coordiate system from two vectors, but scale with distance between input point""" u = b - a if tol_eq(norm(u), 0.0): # 2006/6/30 return None #else: # u = u / norm(u) v = vector([-u[1], u[0]]) hcs = matrix_factory([[u[0], v[0], a[0]], [u[1], v[1], a[1]], [0.0, 0.0, 1.0]]) return hcs
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 solve_add_3D(a, b, c, a_cab, d_ab, d_bc): """returns a list of Configurations of v1,v2,v3 such that distance v1-v2=d12 etc. v<x>: name of point variables d<xy>: numeric distance values a<xyz>: numeric angle in radians """ diag_print("solve_dad: %s %s %s %f %f %f" % (a, b, c, a_cab, d_ab, d_bc), "clmethods") p_a = vector([0.0, 0.0]) p_b = vector([d_ab, 0.0]) dir = vector([math.cos(-a_cab), math.sin(-a_cab)]) solutions = cr_int(p_b, d_bc, p_a, dir) rval = [] p_a.append(0.0) p_b.append(0.0) for p_c in solutions: p_c.append(0.0) map = {a: p_a, b: p_b, c: p_c} rval.append(Configuration(map)) return rval
def solve_fixed(self, fixed, layers): for i, layer in enumerate(layers): print("Solving fixed ", layer.id) i = 0 for point in layer.named_pairs: if point[0] in fixed: self.problem.add_constraint( FixConstraint(point[0], vector([point[1], point[2], 0]))) i += 1
def test_mergehogs(): diag_select(".") problem = GeometricProblem(dimension=2) problem.add_point('x', vector([0.0, 0.0])) problem.add_point('a', vector([1.0, 0.0])) problem.add_point('b', vector([0.0, 1.0])) problem.add_point('c', vector([-1.0, 0.0])) problem.add_point('d', vector([0.0, -1.0])) problem.add_constraint(AngleConstraint('a', 'x', 'b', 30.0 / 180 * math.pi)) problem.add_constraint(AngleConstraint('b', 'x', 'c', 30.0 / 180 * math.pi)) problem.add_constraint(AngleConstraint('c', 'x', 'd', 30.0 / 180 * math.pi)) solver = GeometricSolver(problem) print solver.dr for hog in solver.dr.hedgehogs(): conf = list(solver.mg.get(hog))[0] print hog print conf print problem.verify(conf.map)
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 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 test_mate(): problem = GeometricProblem(dimension=3) # create and mate two blocks add_block(problem, "A", 4.0, 2.0, 6.0) add_block(problem, "B", 4.0, 2.0, 6.0) mate_blocks(problem, "A", 'right-bot-front','right-bot-back','right-top-front', "B", 'left-bot-front','left-bot-back','left-top-front', 0.5, 0.0) # add global coordinate system problem.add_point("origin",vector([0.0,0.0,0.0])) problem.add_point("x-axis",vector([1.0,0.0,0.0])) problem.add_point("y-axis",vector([0.0,1.0,0.0])) problem.add_constraint(FixConstraint("origin",vector([0.0,0.0,0.0]))) problem.add_constraint(FixConstraint("x-axis",vector([1.0,0.0,0.0]))) problem.add_constraint(FixConstraint("y-axis",vector([0.0,1.0,0.0]))) # fix block1 to cs problem.add_constraint(MateConstraint("origin","x-axis","y-axis", block_var("A", "left-bot-front"),block_var("A", "right-bot-front"),block_var("A", "left-top-front"), id_transform_3D())) test(problem)
def line_problem_2d_0(): """A problem with a Line (and no CoincicentConstraints)""" problem = GeometricProblem(dimension=2) problem.add_variable(Line('l1'),vector([0.0, 0.0, 1.0, 1.0])) return problem
def add_block(problem,name,x,y,z): """A block with variables name+#1...8 and dimensions x,y,z""" problem.add_point(block_var(name,'left-bot-front'), vector([-1.0, -1.0, -1.0])) problem.add_point(block_var(name,'left-bot-back'), vector([-1.0, -1.0, 1.0])) problem.add_point(block_var(name,'left-top-front'), vector([-1.0, 1.0, -1.0])) problem.add_point(block_var(name,'left-top-back'), vector([-1.0, 1.0, 1.0])) problem.add_point(block_var(name,'right-bot-front'), vector([1.0, -1.0, -1.0])) problem.add_point(block_var(name,'right-bot-back'), vector([1.0, -1.0, 0.0])) problem.add_point(block_var(name,'right-top-front'), vector([1.0, 1.0, -1.0])) problem.add_point(block_var(name,'right-top-back'), vector([1.0, 1.0, 1.0])) conf = Configuration({ block_var(name,'left-bot-front'):vector([-x/2, -y/2, -z/2]), block_var(name,'left-bot-back'):vector([-x/2, -y/2, +z/2]), block_var(name,'left-top-front'):vector([-x/2, +y/2, -z/2]), block_var(name,'left-top-back'):vector([-x/2, +y/2, +z/2]), block_var(name,'right-bot-front'):vector([+x/2, -y/2, -z/2]), block_var(name,'right-bot-back'):vector([+x/2, -y/2, +z/2]), block_var(name,'right-top-front'):vector([+x/2, +y/2, -z/2]), block_var(name,'right-top-back'):vector([+x/2, +y/2, +z/2]) }) problem.add_constraint(RigidConstraint(conf)) return problem