Commit 165824b1 by 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!