def _get_spline(cls, points, pix_err=2, need_sort=True, **kwargs):
'''
Returns a closed spline for the points handed in.
Input is assumed to be a (2xN) array
=====
input
=====
:param points: the points to fit the spline to
:type points: a 2xN ndarray or a list of len =2 tuples
:param pix_err: the error is finding the spline in pixels
:param need_sort: if the points need to be sorted
or should be processed as-is
=====
output
=====
tck
The return data from the spline fitting
'''
if type(points) is np.ndarray:
# make into a list
pt_lst = zip(*points)
# get center
center = np.mean(points, axis=1).reshape(2, 1)
else:
# make a copy of the list
pt_lst = list(points)
# compute center
tmp_fun = lambda x, y: (x[0] + y[0], x[1] + y[1])
center = np.array(reduce(tmp_fun, pt_lst)).reshape(2, 1)
center /= len(pt_lst)
if len(pt_lst) < 5:
raise TooFewPointsException("not enough points")
if need_sort:
# sort the list by angle around center
pt_lst.sort(key=lambda x: np.arctan2(x[1] - center[1],
x[0] - center[0]))
# add first point to end because it is periodic (makes the
# interpolation code happy)
pt_lst.append(pt_lst[0])
# make array for handing in to spline fitting
pt_array = np.vstack(pt_lst).T
# do spline fitting
tck, u = si.splprep(pt_array, s=len(pt_lst) * (pix_err ** 2), per=True)
return tck
04-spline_fitter.py 文件源码
python
阅读 20
收藏 0
点赞 0
评论 0
评论列表
文章目录