def main(): #create points with the swig doubleArray proxy #http://www.swig.org/Doc3.0/SWIGDocumentation.html#Library_carrays p = shapeopPython.doubleArray(12) #column major p[0] = 0.; p[3] = 0.5; p[6] = 0.5; p[9] = 0.; p[1] = 0.; p[4] = 0.; p[7] = 1.; p[10] = 1.; p[2] = 0.; p[5] = 1.; p[8] = 0.; p[11] = 1.; print "Input points:" printArray(p, 4) s=shapeopPython.shapeop_create() shapeopPython.shapeop_setPoints(s, p, 4) weight = 1. #add a plane constraint to all the vertices. ids = shapeopPython.intArray(4) ids[0] = 0; ids[1] = 1; ids[2] = 2; ids[3] = 3; shapeopPython.shapeop_addConstraint(s, "Plane", ids, 4, weight) #add a closeness constraint to the 1st vertex. ids = shapeopPython.intArray(1) ids[0] = 0; shapeopPython.shapeop_addConstraint(s, "Closeness", ids, 1, weight) #add a closeness constraint to the 4th vertex. ids = shapeopPython.intArray(1) ids[0] = 3; shapeopPython.shapeop_addConstraint(s, "Closeness", ids, 1, weight) shapeopPython.shapeop_init(s) shapeopPython.shapeop_solve(s, 10) shapeopPython.shapeop_getPoints(s, p, 4) shapeopPython.shapeop_delete(s) print "Output points:" printArray(p, 4)
def solve(self, niter): s = shapeopPython.shapeop_create() # Doesn't seem that we could just create a doubleArray that references the # same underlying data array = shapeopPython.doubleArray(self.data.shape[0] * self.npoints) for y in xrange(self.data.shape[0]): for x in xrange(self.npoints): array[self.data.shape[0] * x + y] = self.data[y, x] shapeopPython.shapeop_setPoints(s, array, self.npoints) for c, w in self.constraints: ids = shapeopPython.intArray(len(c.args)) for i in xrange(len(c.args)): ids[i] = c.args[i] shapeopPython.shapeop_addConstraint(s, c.__cname__, ids, len(c.args), w) shapeopPython.shapeop_init(s) shapeopPython.shapeop_solve(s, niter) shapeopPython.shapeop_getPoints(s, array, self.npoints) shapeopPython.shapeop_delete(s) # np might be more willing to convert from raw memory, but we'll just # copy it back to the data manually for y in xrange(self.data.shape[0]): for x in xrange(self.npoints): self.data[y, x] = array[self.data.shape[0] * x + y]
def main(): #create points with the swig doubleArray proxy #http://www.swig.org/Doc3.0/SWIGDocumentation.html#Library_carrays p = shapeopPython.doubleArray(12) #column major p[0] = 0. p[3] = 0.5 p[6] = 0.5 p[9] = 0. p[1] = 0. p[4] = 0. p[7] = 1. p[10] = 1. p[2] = 0. p[5] = 1. p[8] = 0. p[11] = 1. print "Input points:" printArray(p, 4) s = shapeopPython.shapeop_create() shapeopPython.shapeop_setPoints(s, p, 4) weight = 1. #add a plane constraint to all the vertices. ids = shapeopPython.intArray(4) ids[0] = 0 ids[1] = 1 ids[2] = 2 ids[3] = 3 shapeopPython.shapeop_addConstraint(s, "Plane", ids, 4, weight) #add a closeness constraint to the 1st vertex. ids = shapeopPython.intArray(1) ids[0] = 0 shapeopPython.shapeop_addConstraint(s, "Closeness", ids, 1, weight) #add a closeness constraint to the 4th vertex. ids = shapeopPython.intArray(1) ids[0] = 3 shapeopPython.shapeop_addConstraint(s, "Closeness", ids, 1, weight) shapeopPython.shapeop_init(s) shapeopPython.shapeop_solve(s, 10) shapeopPython.shapeop_getPoints(s, p, 4) shapeopPython.shapeop_delete(s) print "Output points:" printArray(p, 4)
def int_array(data): try: len(data[0]) except TypeError: pass else: data = list(flatten(data)) n = len(data) array = shapeopPython.intArray(n) for index, value in enumerate(data): array[index] = int(value) return array