示例#1
0
def fit_glider_3d(cls, glider, numpoints=3):
    """
    Create a parametric model from glider
    """
    shape = glider.shape_simple
    front, back = shape.front, shape.back
    arc = [rib.pos[1:] for rib in glider.ribs]
    aoa = [[front[i][0], rib.aoa_relative] for i, rib in enumerate(glider.ribs)]
    zrot = [[front[i][0], rib.zrot] for i, rib in enumerate(glider.ribs)]

    def symmetric_fit(polyline, numpoints=numpoints):
        mirrored = PolyLine2D(polyline[1:]).mirror([0, 0], [0, 1])
        symmetric = mirrored[::-1].join(polyline[int(glider.has_center_cell):])
        return SymmetricBezier.fit(symmetric, numpoints=numpoints)

    front_bezier = symmetric_fit(front)
    back_bezier = symmetric_fit(back)
    arc_bezier = symmetric_fit(arc)
    aoa_bezier = symmetric_fit(aoa)
    zrot_bezier = symmetric_fit(zrot)

    cell_num = len(glider.cells) * 2 - glider.has_center_cell

    front[0][0] = 0  # for midribs
    start = (2 - glider.has_center_cell) / cell_num
    const_arr = [0.] + np.linspace(start, 1, len(front) - 1).tolist()

    rib_pos = [p[0] for p in front]
    cell_centers = [(p1+p2)/2 for p1, p2 in zip(rib_pos[:-1], rib_pos[1:])]

    rib_pos_int = Interpolation(zip([0] + rib_pos[1:], const_arr))
    rib_distribution = [[i, rib_pos_int(i)] for i in np.linspace(0, rib_pos[-1], 30)]
    rib_distribution = Bezier.fit(rib_distribution, numpoints=numpoints+3)

    profiles = [rib.profile_2d for rib in glider.ribs]
    profile_dist = Bezier.fit([[i, i] for i, rib in enumerate(front)],
                                   numpoints=numpoints)

    balloonings = [cell.ballooning for cell in glider.cells]
    ballooning_dist = Bezier.fit([[i, i] for i, rib in enumerate(front[1:])],
                                   numpoints=numpoints)

    zrot = Bezier([[0, 0], [front.last()[0], 0]])

    # TODO: lineset, dist-curce->xvalues

    parametric_shape = ParametricShape(front_bezier, back_bezier, rib_distribution, cell_num)
    parametric_arc = ArcCurve(arc_bezier)

    return cls(shape=parametric_shape,
               arc=parametric_arc,
               aoa=aoa_bezier,
               zrot=zrot_bezier,
               profiles=profiles,
               profile_merge_curve=profile_dist,
               balloonings=balloonings,
               ballooning_merge_curve=ballooning_dist,
               glide=glider.glide,
               speed=10,
               lineset=LineSet2D([]))
示例#2
0
    def __init__(self,
                 yvalue,
                 front_cut,
                 back_cut=1,
                 func=None,
                 name="minirib"):
        #Profile3D.__init__(self, [], name)

        if not func:  # Function is a bezier-function depending on front/back
            if front_cut > 0:
                points = [[front_cut, 1],
                          [front_cut * 2. / 3 + back_cut * 1. / 3, 0]]  #
            else:
                points = [[front_cut, 0]]

            if back_cut < 1:
                points = points + [[front_cut * 1. / 3 + back_cut * 2. / 3, 0],
                                   [back_cut, 1]]
            else:
                points = points + [[back_cut, 0]]

            func = Bezier(points).interpolation()

        self.__function__ = func

        self.y_value = yvalue
        self.front_cut = front_cut
        self.back_cut = back_cut
示例#3
0
    def get_flattened(self, rib, numpoints=30):
        curve = [[self.end, 0.75], [self.end - 0.05, 1], [self.front, 0],
                 [self.end - 0.05, -1], [self.end, -0.75]]
        profile = rib.profile_2d

        cp = [profile.align(point) * rib.chord for point in curve]

        return Bezier(cp).interpolation(numpoints)
示例#4
0
 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()
示例#5
0
    def __init__(self, obj):
        super(BaseMergeTool, self).__init__(obj)
        self.bezier_curve = Bezier([[0, 0], [1, 1]])
        self.bezier_cpc = ControlPointContainer(
            self.bezier_curve.controlpoints, self.view)
        self.shape = coin.SoSeparator()
        self.grid = coin.SoSeparator()
        self.coords = coin.SoSeparator()
        self.expl_curve = Line([])

        _shape = self.parametric_glider.shape.get_half_shape()
        self.ribs = _shape.ribs
        self.front = _shape.front
        self.back = _shape.back

        self.bezier_cpc.on_drag.append(self.update_spline)
        self.setup_widget()
        self.setup_pivy()
示例#6
0
 def setUp(self):
     controlpoints = [[i, random.random()] for i in range(15)]
     self.bezier = Bezier(controlpoints)
示例#7
0
 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)