diff --git a/python/geom2d.py b/python/geom2d.py index 886bfb60..3bd69d14 100644 --- a/python/geom2d.py +++ b/python/geom2d.py @@ -1,5 +1,6 @@ from .libngpy._geom2d import SplineGeometry, Solid2d, CSG2d, Rectangle, Circle, EdgeInfo, PointInfo from .meshing import meshsize +import math as math unit_square = SplineGeometry() _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) else: 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