def createRationalHyperbola(self): import vtk erp = vtk.vtkPatchInterpolation() cpt = vtk.vtkDoubleArray() pts = vtk.vtkPoints() pd = vtk.vtkPolyData() ln = vtk.vtkCellArray() pd.SetPoints(pts) pd.SetLines(ln) prange = [0, 1] ns = 21; # generate control points of ellipse for one quadrant erp.GenerateHyperbolaCtrlPt(cpt, 1., 3.) npts = cpt.GetNumberOfTuples() degree = [npts - 1,0,0] self.assertGreater(degree[0], 0, 'Need at least 2 control points, got {n}'.format(n=npts)) # compute points coordinates params = [0., 0., 0.] delta = (prange[1] - prange[0]) / (ns - 1.) for r in [prange[0] + delta * x for x in range(ns)]: params[0] = r erp.InterpolateOnPatch(pts.GetData(), 1, cpt, degree, params) [ln.InsertNextCell(2, [i, i+1]) for i in range(ns - 1)] #wri = vtk.vtkPolyDataWriter() #wri.SetInputDataObject(pd) #wri.SetFileName('bezier-{shape}.vtk'.format(shape='hyperbola')) #wri.Write() return pd
def createRationalEllipse(self): import vtk # declare vals erp = vtk.vtkPatchInterpolation() cpt = vtk.vtkDoubleArray() pts = vtk.vtkPoints() pd = vtk.vtkPolyData() ln = vtk.vtkCellArray() pd.SetPoints(pts) pd.SetLines(ln) prange = [0, 1] ns = 21 center = vtk.vtkVector3d() center.SetX(0.0) center.SetY(0.0) center.SetZ(0.0) majorAxis = vtk.vtkVector3d() majorAxis.SetX(1.0) majorAxis.SetY(0.0) majorAxis.SetZ(0.0) minorAxis = vtk.vtkVector3d() minorAxis.SetX(0.0) minorAxis.SetY(1.414) minorAxis.SetZ(1.414) for quadrant in range(1, 5): # generate control points of ellipse for one quadrant erp.GenerateEllipseCtrlPt(cpt, center, majorAxis, minorAxis, quadrant) npts = cpt.GetNumberOfTuples() degree = [npts - 1, 0, 0] self.assertGreater( degree[0], 0, 'Need at least 2 control points, got {n}'.format(n=npts)) # compute points coordinates params = [0., 0., 0.] delta = (prange[1] - prange[0]) / (ns - 1.) for r in [prange[0] + delta * x for x in range(ns)]: params[0] = r erp.InterpolateOnPatch(pts.GetData(), 1, cpt, degree, params) [ ln.InsertNextCell(2, [(quadrant - 1) * ns + i, (quadrant - 1) * ns + i + 1]) for i in range(ns - 1) ] wri = vtk.vtkPolyDataWriter() wri.SetInputDataObject(pd) wri.SetFileName('bezier-{shape}.vtk'.format(shape='ellipse3d')) wri.Write() return pd
def createRationalEllipse(self): import vtk # declare vals erp = vtk.vtkPatchInterpolation() cpt = vtk.vtkDoubleArray() pts = vtk.vtkPoints() pd = vtk.vtkPolyData() ln = vtk.vtkCellArray() pd.SetPoints(pts) pd.SetLines(ln) prange = [0, 1] ns = 21 center = vtk.vtkVector3d() center.SetX(0.0) center.SetY(0.0) center.SetZ(0.0) majorAxis = vtk.vtkVector3d() majorAxis.SetX(1.0) majorAxis.SetY(0.0) majorAxis.SetZ(0.0) minorAxis = vtk.vtkVector3d() minorAxis.SetX(0.0) minorAxis.SetY(1.414) minorAxis.SetZ(1.414) for quadrant in range(1, 5): # generate control points of ellipse for one quadrant erp.GenerateEllipseCtrlPt(cpt, center, majorAxis, minorAxis, quadrant) npts = cpt.GetNumberOfTuples() degree = [npts - 1,0,0] self.assertGreater(degree[0], 0, 'Need at least 2 control points, got {n}'.format(n=npts)) # compute points coordinates params = [0., 0., 0.] delta = (prange[1] - prange[0]) / (ns - 1.) for r in [prange[0] + delta * x for x in range(ns)]: params[0] = r erp.InterpolateOnPatch(pts.GetData(), 1, cpt, degree, params) [ln.InsertNextCell(2, [(quadrant-1)*ns + i, (quadrant-1)*ns + i+1]) for i in range(ns - 1)] wri = vtk.vtkPolyDataWriter() wri.SetInputDataObject(pd) wri.SetFileName('bezier-{shape}.vtk'.format(shape='ellipse3d')) wri.Write() return pd
def createRationalHyperbola(self): import vtk erp = vtk.vtkPatchInterpolation() cpt = vtk.vtkDoubleArray() pts = vtk.vtkPoints() pd = vtk.vtkPolyData() ln = vtk.vtkCellArray() pd.SetPoints(pts) pd.SetLines(ln) prange = [0, 1] ns = 21 # generate control points of ellipse for one quadrant erp.GenerateHyperbolaCtrlPt(cpt, 1., 3.) npts = cpt.GetNumberOfTuples() degree = [npts - 1, 0, 0] self.assertGreater( degree[0], 0, 'Need at least 2 control points, got {n}'.format(n=npts)) # compute points coordinates params = [0., 0., 0.] delta = (prange[1] - prange[0]) / (ns - 1.) for r in [prange[0] + delta * x for x in range(ns)]: params[0] = r erp.InterpolateOnPatch(pts.GetData(), 1, cpt, degree, params) [ln.InsertNextCell(2, [i, i + 1]) for i in range(ns - 1)] #wri = vtk.vtkPolyDataWriter() #wri.SetInputDataObject(pd) #wri.SetFileName('bezier-{shape}.vtk'.format(shape='hyperbola')) #wri.Write() return pd
def verifyRationalCurve(self, ctrlPts, f, prange, ns, name): """Evaluate points along a curve. ctrlPts is a list of 4-tuple control points defining a rational Bezier curve (the 4-th coordinate is the weight). f is an implicit function that takes a point in and returns zero if it lies on the curve. prange is list containing minimum and maximum parameter values. ns is the number of points to sample between the min/max. """ import vtk npts = len(ctrlPts) degree = [npts - 1, 0, 0] self.assertGreater( degree[0], 0, 'Need at least 2 control points, got {n}'.format(n=npts)) cpt = vtk.vtkDoubleArray() cpt.SetNumberOfComponents(len(ctrlPts[0])) cpt.SetNumberOfTuples(npts) [cpt.SetTuple(i, ctrlPts[i]) for i in range(npts)] erp = vtk.vtkPatchInterpolation() pts = vtk.vtkPoints() pd = vtk.vtkPolyData() ln = vtk.vtkCellArray() pd.SetPoints(pts) pd.SetLines(ln) params = [0., 0., 0.] delta = (prange[1] - prange[0]) / (ns - 1.) for r in [prange[0] + delta * x for x in range(ns)]: params[0] = r erp.InterpolateOnPatch(pts.GetData(), 1, cpt, degree, params) # Test that f(xyz) = 0 to within 6 decimal places. We use 6 places # because vtkPoints stores values as 'float' by default and floats # are at places only accurate to 7 or 8 decimal digits. #xyz = pts.GetPoint(pts.GetNumberOfPoints() - 1) #self.assertAlmostEqual(f(xyz), 0., 6, # 'Point does not satisfy implicit function; f{p} = {f} != 0'.format(p=xyz, f=f(xyz))) # For debugging, uncomment the lines below. They will # write a VTK polydata file containing the output points. ## Insert line segments connecting the points and ## write out the resulting polydata to a file: [ln.InsertNextCell(2, [i, i + 1]) for i in range(ns - 1)] #wri = vtk.vtkPolyDataWriter() #wri.SetInputDataObject(pd) #wri.SetFileName('bezier-{shape}.vtk'.format(shape=name)) #wri.Write() # Create Instance for Rendering # #pdMapper = vtk.vtkPolyDataMapper() #pdMapper.SetInputData(pd) #pdActor = vtk.vtkActor() #pdActor.SetMapper(pdMapper) # Create rendering stuff # #ren = vtk.vtkRenderer() #renWin = vtk.vtkRenderWindow() #renWin.AddRenderer(ren) #ren.AddActor(pdActor) #renWin.SetSize(400, 150) #renWin.Render() #winToImg = vtk.vtkWindowToImageFilter() #winToImg.SetInput(renWin) #winToImg.Update() #imgWri = vtk.vtkPNGWriter() #imgWri.SetFileName('bezier-{shape}.png'.format(shape=name)) #imgWri.SetInputConnection(winToImg.GetOutputPort()) #imgWri.Write() #img_file = 'bezier-{shape}.png'.format(shape=name) #vtk.test.Testing.compareImage(renWin, vtk.test.Testing.getAbsImagePath(img_file), threshold=25) return pd
def verifyRationalCurve(self, ctrlPts, f, prange, ns, name): """Evaluate points along a curve. ctrlPts is a list of 4-tuple control points defining a rational Bezier curve (the 4-th coordinate is the weight). f is an implicit function that takes a point in and returns zero if it lies on the curve. prange is list containing minimum and maximum parameter values. ns is the number of points to sample between the min/max. """ import vtk npts = len(ctrlPts) degree = [npts - 1,0,0] self.assertGreater(degree[0], 0, 'Need at least 2 control points, got {n}'.format(n=npts)) cpt = vtk.vtkDoubleArray() cpt.SetNumberOfComponents(len(ctrlPts[0])) cpt.SetNumberOfTuples(npts) [cpt.SetTuple(i, ctrlPts[i]) for i in range(npts)] erp = vtk.vtkPatchInterpolation() pts = vtk.vtkPoints() pd = vtk.vtkPolyData() ln = vtk.vtkCellArray() pd.SetPoints(pts) pd.SetLines(ln) params = [0., 0., 0.] delta = (prange[1] - prange[0]) / (ns - 1.) for r in [prange[0] + delta * x for x in range(ns)]: params[0] = r erp.InterpolateOnPatch(pts.GetData(), 1, cpt, degree, params) # Test that f(xyz) = 0 to within 6 decimal places. We use 6 places # because vtkPoints stores values as 'float' by default and floats # are at places only accurate to 7 or 8 decimal digits. #xyz = pts.GetPoint(pts.GetNumberOfPoints() - 1) #self.assertAlmostEqual(f(xyz), 0., 6, # 'Point does not satisfy implicit function; f{p} = {f} != 0'.format(p=xyz, f=f(xyz))) # For debugging, uncomment the lines below. They will # write a VTK polydata file containing the output points. ## Insert line segments connecting the points and ## write out the resulting polydata to a file: [ln.InsertNextCell(2, [i, i+1]) for i in range(ns - 1)] #wri = vtk.vtkPolyDataWriter() #wri.SetInputDataObject(pd) #wri.SetFileName('bezier-{shape}.vtk'.format(shape=name)) #wri.Write() # Create Instance for Rendering # #pdMapper = vtk.vtkPolyDataMapper() #pdMapper.SetInputData(pd) #pdActor = vtk.vtkActor() #pdActor.SetMapper(pdMapper) # Create rendering stuff # #ren = vtk.vtkRenderer() #renWin = vtk.vtkRenderWindow() #renWin.AddRenderer(ren) #ren.AddActor(pdActor) #renWin.SetSize(400, 150) #renWin.Render() #winToImg = vtk.vtkWindowToImageFilter() #winToImg.SetInput(renWin) #winToImg.Update() #imgWri = vtk.vtkPNGWriter() #imgWri.SetFileName('bezier-{shape}.png'.format(shape=name)) #imgWri.SetInputConnection(winToImg.GetOutputPort()) #imgWri.Write() #img_file = 'bezier-{shape}.png'.format(shape=name) #vtk.test.Testing.compareImage(renWin, vtk.test.Testing.getAbsImagePath(img_file), threshold=25) return pd