示例#1
0
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()
示例#2
0
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()
示例#3
0
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)
示例#4
0
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)
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)