Commit 165824b1 authored by manon222's avatar manon222 Committed by Baptiste Durand

methode_arrondis

parent fb2f796e
......@@ -10,8 +10,10 @@ Object designed to represent geometrical entitites of dimension two
and instantiate them in a gmsh model.
"""
from .curves import Line, Arc
from .point import Point
from . import factory, np, logger, model
from .tools import round_corner, offset
from .tools import round_corner, offset, calcul_R, unit_vect,bisector,angle_between
from .curves import Line, AbstractCurve
......@@ -202,6 +204,76 @@ class LineLoop(object):
)
self.sides = round_corner_2_sides(result_1D)
def round_corner_kagome(self, r,a,alpha):
""" Opération d'arrondi des angles spécifique au kagomé appliquée à tous les sommets du polygone.
r = rayon du cercle inscrit dans la jonction
alpha = paramètre d'ouverture du kagomé
a : taille de la cellule de base
b : taille des éléments triangulaires
theta : rotation du triangle à l'intérieur de la cellule de base
"""
fine_points=[]#points centres des jonctions
effect_R,phi_1,phi_2=calcul_R(alpha,r,a)
# ! ESSAI
result_1D = list()
for i in range(len(self.vertices)):
#if phi_1 < 10E-5 or phi_2 < 10E-5:
#print("pas d_arrondi")
# print("R=",effect_R)
#print("phi_1=", phi_1)
# print("phi_2=", phi_2)
# pt_amt_milieu=Point((self.vertices[i-2].coord+self.vertices[i-1].coord)/2)
#pt_avl_milieu=Point((self.vertices[i].coord+self.vertices[i-1].coord)/2)
#racc_amt = Line(pt_amt_milieu,self.vertices[i-1])
# racc_avl = Line(self.vertices[i-1], pt_avl_milieu)
# geoList = [racc_amt, racc_avl]
d2 = effect_R / np.sin(phi_2)
d1 = effect_R / np.sin(phi_1)
dir_1=self.vertices[i - 2].coord-self.vertices[i-1].coord
dir_2=self.vertices[i].coord-self.vertices[i-1].coord
dir_1=unit_vect(dir_1)
dir_2 = unit_vect(dir_2)
#print("OA",dir_1)
# print("OC",dir_2)
A = Point(self.vertices[i-1].coord + effect_R * dir_1)
C = Point(self.vertices[i-1].coord + effect_R * dir_2)
alpha = angle_between(dir_1, dir_2, orient=True)
v_biss = bisector(dir_1, dir_2)
if alpha < 0:
v_biss = -v_biss
# print("somme angulaire",np.pi/2-phi_1+np.pi/2-phi_2+np.pi/3)
#print("angle mesuré",angle_between(v_biss,dir_1))
# print("difference angle avec phi_2",abs(abs(angle_between(v_biss,dir_1)) -(np.pi / 2 - phi_2)))
# print("difference angle avec phi_1", abs(abs(angle_between(v_biss,dir_1)) -(np.pi / 2 - phi_1)))
if abs(abs(angle_between(v_biss,dir_1)) -(np.pi / 2 - phi_2))<10E-14:#si on est du côté où l'angle vaut theta
d=d2
elif abs(abs(angle_between(v_biss,dir_1)) -(np.pi / 2 - phi_1))<10E-14:
d=d1
else:
raise ValueError("mauvaise gestion de d1 et d2")
B = Point(self.vertices[i-1].coord + d * v_biss)
#if d-r>0:
# fine_points.append(Point(d*v_biss))
round_arc = Arc(A, B, C)
racc_amt = Line(self.vertices[i - 2], A)
racc_avl = Line(C, self.vertices[i])
geoList = [racc_amt, round_arc, racc_avl]
# dir_3 = np.array([- dir_1.coord[1] , dir_1.coord[0] , 0.0])
# dir_4 = np.array([dir_2.coord[1], - dir_2.coord[0], 0.0])
# dir_3 = unit_vect(dir_3) #a priori inutile #direction AB
# dir_4 = unit_vect(dir_4)#direction CB
result_1D.append(geoList)
self.sides = round_corner_2_sides(result_1D)
#return fine_points
def vertices_2_sides(self):
""" Méthode permettant de générer les segments reliant les sommets.
Si une opération round_corner est utilisé, cette opération est inutile."""
......
......@@ -118,7 +118,15 @@ def round_corner(inp_pt, pt_amt, pt_avl, r, junction_raduis=False, plot=False):
if alpha < 0:
# corriger le cas des angles \in ]-pi;0[ = ]pi;2pi[]. L'arrondi est toujours dans le secteur <180° #noqa
v_biss = -v_biss
# if abs(alpha-math.pi)<10E-4:
# pt_amt_milieu=Point((pt_amt.coord+inp_pt.coord)/2)
# pt_avl_milieu=Point((pt_avl.coord+inp_pt.coord)/2)
# racc_amt = Line(pt_amt_milieu, inp_pt)
#racc_avl = Line(inp_pt, pt_avl_milieu)
# geoList = [racc_amt, racc_avl]
#raise ValueError("angle quasi plat")
#return geoList
if junction_raduis:
if plot:
R = copy.deepcopy(r)
......@@ -166,6 +174,53 @@ def round_corner(inp_pt, pt_amt, pt_avl, r, junction_raduis=False, plot=False):
return geoList
def calcul_R(alpha,r,a):
#méthode de construction des jonctions propres au kagomé
x_a = (1 - alpha) * a / 2 - alpha * a
y_a = (1 - alpha) * a * np.sqrt(3) / 2
b = np.sqrt(x_a ** 2 + y_a ** 2)
theta = np.arcsin(np.sqrt(3) * alpha * a / (2 * b))
# Cas kagomé "fermé"
phi_2 = np.pi / 2 - theta
if alpha < 1 / 3:
phi_1 = np.pi / 6 - theta
effect_R = 2 * r * np.sin(phi_1) * np.sin(phi_2) / (
np.sin(phi_2) * np.cos(phi_1) - np.sin(phi_1) * np.cos(phi_2) - np.sin(phi_2) + np.sin(
phi_1))
if alpha >= 1 / 3:
phi_1 = theta - np.pi / 6
effect_R = 2 * r * np.sin(phi_1) * np.sin(phi_2) / (
- np.sin(phi_2) * np.cos(phi_1) - np.sin(phi_1) * np.cos(phi_2) + np.sin(phi_2) + np.sin(phi_1))
return effect_R,phi_1,phi_2
def fine_point_jonction(inp_pt, pt_amt, pt_avl, r,sharp_r):
"""
Retourne le point au centre d'une jonction défini par deux angles aigus "dans le même sens"
"""
from .transformations import translation
# Direction en amont et en aval
v_amt = unit_vect(pt_amt.coord - inp_pt.coord)
v_avl = unit_vect(pt_avl.coord - inp_pt.coord)
alpha = angle_between(v_amt, v_avl, orient=True)
v_biss = bisector(v_amt, v_avl)
if alpha < 0:
# corriger le cas des angles \in ]-pi;0[ = ]pi;2pi[]. L'arrondi est toujours dans le secteur <180° #noqa
v_biss = -v_biss
# Calcul des distances centre - sommet de l'angle et sommet - point de raccordement
dist_center = float(r/2+sharp_r) / abs(math.sin(alpha / 2.0))
pt_ctr = translation(inp_pt, dist_center * v_biss)
return pt_ctr
def offset(pt, pt_dir1, pt_dir2, distance, method="vertex"):
"""[summary]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment