#! /usr/bin/python2
# -*- coding: utf-8; -*-
#
# (c) 2013 booya (http://booya.at)
#
# This file is part of the OpenGlider project.
#
# OpenGlider is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# OpenGlider is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenGlider. If not, see <http://www.gnu.org/licenses/>.
#from openglider import Profile2D
from openglider.plots.marks import polygon
from openglider.vector import cut, Vectorlist2D
[docs]class RigidFoil(object):
def __init__(self, rib_no, start=-0.1, end=0.1, distance=0.005):
self.rib_no = rib_no
self.start = start
self.end = end
self.func = lambda x: distance
[docs] def get_3d(self, glider):
######NEEDED??
pass
[docs] def get_length(self, glider):
flat = self.get_flattened(glider=glider)
flat = Vectorlist2D(flat)
flat.check()
return flat.get_length()
[docs] def get_flattened(self, glider):
profile = glider.ribs[self.rib_no].profile_2d
normvectors = Vectorlist2D(profile.normvectors)
__, start = profile.profilepoint(self.start)
__, end = profile.profilepoint(self.end)
list_1 = profile.data.get(start, end)
list_2 = normvectors.get(start, end)
return [list_1[i] + self.func(list_1[i]) * list_2[i] for i in range(len(list_1))]
[docs]class GibusArcs(object):
def __init__(self, rib_no, position, size=0.2):
"""A Reinforcement in the form of an arc, in the shape of an arc, to reinforce attachment points"""
self.rib_no = rib_no
self.pos = position
self.size = size
self.size_abs = False
[docs] def get_3d(self, glider, num_points=10):
# create circle with center on the point
gib_arc = self.get_flattened(glider, num_points=num_points)
rib = glider.ribs[self.rib_no]
return [rib.align([p[0], p[1], 0]) for p in gib_arc]
[docs] def get_flattened(self, glider, ribs_2d=None, num_points=10):
# get center point
profile = glider.ribs[self.rib_no].profile_2d
start, point_1 = profile.profilepoint(self.pos)
if self.size_abs:
point_2 = point_1 + [self.size, 0]
else:
__, point_2 = profile.profilepoint(self.pos + self.size)
gib_arc = [[], []] # first, second
circle = polygon(point_1, point_2, num=num_points, is_center=True)[0]
second = False
for i in range(len(circle)):
#print(airfoil.contains_point(circle[i]))
if profile.contains_point(circle[i]) or \
(i < len(circle) - 1 and profile.contains_point(circle[i + 1])) or \
(i > 1 and profile.contains_point(circle[i - 1])):
gib_arc[second].append(circle[i])
else:
second = True
# Cut first and last
gib_arc = gib_arc[1] + gib_arc[0] # [secondlist] + [firstlist]
gib_arc[0], start2, __ = profile.cut(gib_arc[0], gib_arc[1], start)
gib_arc[-1], stop, __ = profile.cut(gib_arc[-2], gib_arc[-1], start)
# Append Profile_List
gib_arc += profile.get(start2, stop).tolist()
return gib_arc
[docs]class RibHole(object):
def __init__(self, rib_no, pos, size=0.5, numpoints=20):
self.rib_no = rib_no
self.pos = pos
self.size = size
self.numpoints = numpoints
[docs] def get_3d(self, glider, num=20):
rib = glider.ribs[self.rib_no]
hole = self.get_flattened(glider, num=num)
return [rib.align([p[0], p[1], 0]) for p in hole]
[docs] def get_flattened(self, glider, num=20):
rib = glider.ribs[self.rib_no]
p1 = rib.profile_2d.profilepoint(self.pos)[1]
p2 = rib.profile_2d.profilepoint(-self.pos)[1]
return polygon(p1, p2, num=num, size=self.size, is_center=False)[0]
[docs]class Mylar(object):
pass