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([]))
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 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)
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) }