示例#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 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)
示例#3
0
 def fit_region(self, start, stop, num_points, control_points):
     smoothened = [
         self[self(x)] for x in np.linspace(start, stop, num=num_points)
     ]
     return Bezier.fit(smoothened, numpoints=num_points)
示例#4
0
def get_geometry_explicit(sheet):
    # All Lists
    front = []
    back = []
    cell_distribution = []
    aoa = []
    arc = []
    profile_merge = []
    ballooning_merge = []
    zrot = []

    y = z = span_last = alpha = 0.
    for i in range(1, sheet.nrows()):
        line = [sheet.get_cell([i, j]).value for j in range(sheet.ncols())]
        if not line[0]:
            break  # skip empty line
        if not all(isinstance(c, numbers.Number) for c in line[:10]):
            raise ValueError("Invalid row ({}): {}".format(i, line))
        # Index, Choord, Span(x_2d), Front(y_2d=x_3d), d_alpha(next), aoa,
        chord = line[1]
        span = line[2]
        x = line[3]
        y += np.cos(alpha) * (span - span_last)
        z -= np.sin(alpha) * (span - span_last)

        alpha += line[4] * np.pi / 180  # angle after the rib

        aoa.append([span, line[5] * np.pi / 180])
        arc.append([y, z])
        front.append([span, -x])
        back.append([span, -x - chord])
        cell_distribution.append([span, i - 1])

        profile_merge.append([span, line[8]])
        ballooning_merge.append([span, line[9]])

        zrot.append([span, line[7] * np.pi / 180])

        span_last = span

    def symmetric_fit(data, bspline=False):
        not_from_center = int(data[0][0] == 0)
        mirrored = [[-p[0], p[1]] for p in data[not_from_center:]][::-1] + data
        if bspline:
            return SymmetricBSpline.fit(mirrored)
        else:
            return SymmetricBezier.fit(mirrored)

    has_center_cell = not front[0][0] == 0
    cell_no = (len(front) - 1) * 2 + has_center_cell

    start = (2 - has_center_cell) / cell_no

    const_arr = [0.] + np.linspace(start, 1,
                                   len(front) -
                                   (not has_center_cell)).tolist()
    rib_pos = [0.] + [p[0] for p in front[not has_center_cell:]]
    rib_pos_int = Interpolation(zip(rib_pos, 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)

    parametric_shape = ParametricShape(symmetric_fit(front),
                                       symmetric_fit(back), rib_distribution,
                                       cell_no)
    arc_curve = ArcCurve(symmetric_fit(arc))

    return {
        "shape": parametric_shape,
        "arc": arc_curve,
        "aoa": symmetric_fit(aoa),
        "zrot": symmetric_fit(zrot),
        "profile_merge_curve": symmetric_fit(profile_merge, bspline=True),
        "ballooning_merge_curve": symmetric_fit(ballooning_merge, bspline=True)
    }