Merge branch 'csg2d_trig_ellipse' into 'master'

add triangle and ellipse as csg2d solid objects

See merge request jschoeberl/netgen!347
This commit is contained in:
Matthias Hochsteger 2020-11-11 16:40:06 +00:00
commit 6b5ba0b072

View File

@ -1,5 +1,6 @@
from .libngpy._geom2d import SplineGeometry, Solid2d, CSG2d, Rectangle, Circle, EdgeInfo, PointInfo from .libngpy._geom2d import SplineGeometry, Solid2d, CSG2d, Rectangle, Circle, EdgeInfo, PointInfo
from .meshing import meshsize from .meshing import meshsize
import math as math
unit_square = SplineGeometry() unit_square = SplineGeometry()
_pnts = [ (0,0), (1,0), (1,1), (0,1) ] _pnts = [ (0,0), (1,0), (1,1), (0,1) ]
@ -144,3 +145,34 @@ def cp(p_or_px, py_or_none = None):
return EdgeInfo(control_point=p) return EdgeInfo(control_point=p)
else: else:
return EdgeInfo(control_point=(p_or_px,py_or_none)) return EdgeInfo(control_point=(p_or_px,py_or_none))
def Ellipse(center, a, b, bc="ellipse", mat="ellipse"):
"""Creates ellipse centered at point center with principle axis a and b.
Parameters
---------
center : Vec2
center of ellipse
a : Vec2
first principle axis, needs to be perpendicular to b
b : Vec2
second principle axis, needs to be perpendicular to a
bc : string
boundary name
mat : string
material name
"""
if abs(a[0]*b[0] + a[1]*b[1]) > 1e-12:
raise Exception("In Ellipse: principle axis a and b are not perpendicular")
ellipse = Circle( center=(0,0), radius=1.0, mat=mat, bc=bc )
alpha = math.pi/2-math.atan2(a[0],a[1])
r_a = math.sqrt(a[0]**2+a[1]**2)
r_b = math.sqrt(b[0]**2+b[1]**2)
ellipse.Scale( (r_a,r_b) )
ellipse.Rotate( alpha/math.pi*180, center=(0,0) )
ellipse.Move( center )
return ellipse