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 __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
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)
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 __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()
def setUp(self): controlpoints = [[i, random.random()] for i in range(15)] self.bezier = Bezier(controlpoints)
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)