Using mathutils.geometry.box_fit_2d How does one use the angle returned from mathutils.geometry.box_fit_2d?



For example, in the image above the face is selected &amp; the following is run in the console. (There is no transform on mesh object, so vert coordinates are global coords)

&gt;&gt;&gt; bm = bmesh.from_edit_mesh(C.object.data)
&gt;&gt;&gt; points = [v.co.xy for v in bm.verts if v.select]
&gt;&gt;&gt; points
[Vector((39.5, 125.0)), Vector((40.25, 107.0)), Vector((107.0, 163.0)), Vector((80.5, 159.5))]
&gt;&gt;&gt; a = box_fit_2d(points)
&gt;&gt;&gt; degrees(a)
50.00498629110601


The plane (the square) is rotated 50.005 degrees.

I've found a couple of example usages generally for UVs http://www.programcreek.com/python/example/56195/mathutils.Vector.
The angle returned by box_fit_3d is the angle by which the given points have to be rotated to best fit them into a rectangle aligned with the axes. 

The example script linked in your question – currently there is only one script with a call to box_fit_3d – does indeed use the angle to calculate the coordinates of the rotated points: 

angle = mathutils.geometry.box_fit_2d(cos_2d)

mat = mathutils.Matrix.Rotation(angle, 2)
cos_2d = [(mat * co) for co in cos_2d]
xs = [co.x for co in cos_2d]
ys = [co.y for co in cos_2d]


But if you instead want to fit the original points into a rotated rectangle then you would have to rotate the rectangle by the negative of that angle.
The image below shows the face from your question together with a plane rotated by −50.005 degrees instead.



If you're also interested in the optimal size of the rectangle I guess it's still best to calculate the rotated points and then determine the smallest and largest coordinates like it's been done in the example script. 

width = max(xs) - min(xs)
height = max(ys) - min(ys)