12345678910111213141516171819202122232425262728293031323334 |
- """Fit circles analytically to measure
- the signed curvature of a line"""
- from vedo import *
- shape = Spline([
- [1.0, 2.0, -1.0],
- [1.5, 0.0, 0.4],
- [2.0, 4.0, 0.5],
- [4.0, 1.5, -0.3]],
- res=200,
- )
- n = 5 # nr. of points to use for the fit
- npt = shape.npoints
- points = shape.points
- fitpts, circles, curvs = [], [], [0]*npt
- for i in range(n, npt - n-1):
- pts = points[i-n:i+n]
- center, R, normal = fit_circle(pts)
- z = cross(pts[-1]-pts[0], center-pts[0])[2]
- curvs[i] = sqrt(1/R) * z/abs(z)
- if R < 0.75:
- circle = Circle(center, r=R).wireframe()
- circle.reorient([0,0,1], normal)
- circles.append(circle)
- fitpts.append(center)
- shape.lw(8).cmap('coolwarm', curvs).add_scalarbar3d(title=':pm1/:sqrtR', c='w')
- # use this trick to make the scalarbar3d become a 2d screen object:
- shape.scalarbar = shape.scalarbar.clone2d("bottom-right", 0.2)
- show(shape, circles, Points(fitpts, c='white'), __doc__, axes=1, bg='bb').close()
|