class AirfoilMergeTool(BaseMergeTool): def __init__(self, obj): super(AirfoilMergeTool, self).__init__(obj) self.scal = numpy.array([1, 0.2]) self.x_grid = [i[0] for i in self.front if i[0] >= 0] self.set_end_points() self.bezier_curve = self.parametric_glider.profile_merge_curve self.bezier_curve = Bezier( [self.scal * i for i in self.bezier_curve.controlpoints]) self.bezier_cpc.control_pos = vector3D(self.bezier_curve.controlpoints) self.fix_end_points() def set_end_points(self): self.parametric_glider.profile_merge_curve.controlpoints[0][0] = 0 self.parametric_glider.profile_merge_curve.controlpoints[-1][ 0] = self.parametric_glider.shape.span def update_spline(self): self.bezier_curve.controlpoints = [ point[:2] for point in self.bezier_cpc.control_pos ] self.expl_curve.update(self.bezier_curve.get_sequence(40)) y_grid = range( int( max([ c[1] / self.scal[1] for c in self.bezier_curve.get_sequence(10) ])) + 2) y_grid = [i * self.scal[1] for i in y_grid] self.update_grid(self.x_grid, y_grid) def fix_end_points(self): def y_constraint(pos): return [pos[0], (pos[1] > 0) * pos[1], pos[2]] def c1(pos): pos = y_constraint(pos) return [0, pos[1], pos[2]] def c2(pos): pos = y_constraint(pos) return [self.parametric_glider.shape.span, pos[1], pos[2]] for i, cp in enumerate(self.bezier_cpc.control_points): if i == 0: cp.constraint = c1 elif i == len(self.bezier_cpc.control_points) - 1: cp.constraint = c2 else: cp.constraint = y_constraint self.update_spline() def accept(self): self.parametric_glider.profile_merge_curve.controlpoints = [ cp / self.scal for cp in self.bezier_curve.controlpoints ] super(AirfoilMergeTool, self).accept()
class AirfoilMergeTool(BaseMergeTool): def __init__(self, obj): super(AirfoilMergeTool, self).__init__(obj) self.scal = numpy.array([1, 0.2]) self.x_grid = [i[0] for i in self.front if i[0] >= 0] self.set_end_points() self.bezier_curve = self.ParametricGlider.profile_merge_curve self.bezier_curve = Bezier([self.scal * i for i in self.bezier_curve.controlpoints]) self.bezier_cpc.control_pos = vector3D(self.bezier_curve.controlpoints) self.fix_end_points() def set_end_points(self): self.ParametricGlider.profile_merge_curve.controlpoints[0][0] = 0 self.ParametricGlider.profile_merge_curve.controlpoints[-1][0] = self.ParametricGlider.shape.span def update_spline(self): self.bezier_curve.controlpoints = [point[:2] for point in self.bezier_cpc.control_pos] self.expl_curve.update(self.bezier_curve.get_sequence(40)) y_grid = range(int(max([c[1] / self.scal[1] for c in self.bezier_curve.get_sequence(10)])) + 2) y_grid = [i * self.scal[1] for i in y_grid] self.update_grid(self.x_grid, y_grid) def fix_end_points(self): def y_constraint(pos): return [pos[0], (pos[1] > 0) * pos[1], pos[2]] def c1(pos): pos = y_constraint(pos) return [0, pos[1], pos[2]] def c2(pos): pos = y_constraint(pos) return [self.ParametricGlider.shape.span, pos[1], pos[2]] for i, cp in enumerate(self.bezier_cpc.control_points): if i == 0: cp.constraint = c1 elif i == len(self.bezier_cpc.control_points) - 1: cp.constraint = c2 else: cp.constraint = y_constraint self.update_spline() def accept(self): self.ParametricGlider.profile_merge_curve.controlpoints = [cp / self.scal for cp in self.bezier_curve.controlpoints] super(AirfoilMergeTool, self).accept()
class TestBezier(unittest.TestCase): def setUp(self): controlpoints = [[i, random.random()] for i in range(15)] self.bezier = Bezier(controlpoints) def test_get_value(self): val = random.random() self.assertAlmostEqual(self.bezier(val)[0], self.bezier(val)[0]) self.assertAlmostEqual(self.bezier(val)[1], self.bezier(val)[1]) def test_fit(self): num = len(self.bezier.controlpoints) to_fit = self.bezier.get_sequence() bezier2 = Bezier.fit(to_fit, numpoints=num) for p1, p2 in zip(self.bezier.controlpoints, bezier2.controlpoints): self.assertAlmostEqual(p1[0], p2[0], 0) self.assertAlmostEqual(p1[1], p2[1], 0) def test_length(self): self.bezier.controlpoints = [[0, 0], [2, 0]] self.assertAlmostEqual(self.bezier.get_length(10), 2.) def test_get_sequence(self): sequence = self.bezier.get_sequence(100)
class Spline(Line): def __init__(self, control_points, num=50): self.bezier_curve = Bezier(controlpoints=control_points) self.num = num points = self.bezier_curve.get_sequence(num) super(Spline, self).__init__(points)