2013-10-14 76 views
18

我有一个关于如何在pythonOCC中使用样条的两部分问题。如何在pythonOCC中使用样条曲线?

首先,我知道我可以创建一个样条

array = [] 
array.append(gp_Pnt2d (0,0)) 
array.append(gp_Pnt2d (1,2)) 
array.append(gp_Pnt2d (2,3)) 
array.append(gp_Pnt2d (4,3)) 
array.append(gp_Pnt2d (5,5)) 

pt2d_list = point2d_list_to_TColgp_Array1OfPnt2d(array) 
SPL1  = Geom2dAPI_PointsToBSpline(pt2d_list).Curve() 
display.DisplayShape(make_edge2d(SPL1) , update=True) 

,我想到的是,B样条可以通过

BSPL1  = Geom2dAPI_PointsToBSpline(pt2d_list) 

来计算,但我如何获得:

  1. bspline的衍生物?
  2. bspline的结?
  3. 是结pt2d_list?
  4. bspline的控制点?
  5. 样条的系数?

而我该如何删除或添加结到bspline?

其次,在装载pythonOCC这样的CAD图纸的.stp文件时:

from OCC import TopoDS, StlAPI 
shape = TopoDS.TopoDS_Shape() 
stl_reader = StlAPI.StlAPI_Reader() 
stl_reader.Read(shape,str(filename)) 
display.DisplayShape(shape) 

我如何获取数据出像结,B样条,和系数的形状。

+0

您是否在其他地方找到答案?你可以请与我们分享:D? – Jiloc

+0

绝望老................. –

回答

0

我用python-boost做到了这一点。 看看这个功能:http://letslearncomputing.blogspot.com/2013/04/c-program-for-cubic-spline-interpolation.html 你可以在这里找到你想要的5个值。

你只需要修改代码为C++(不C

BOOST_PYTHON_MODULE(Spline) 
{ 
    import_array(); 
    boost::python::numeric::array::set_module_and_type("numpy", "ndarray"); 
    class_<Spline, Spline*>("Spline", init<>()) 
     .def("spline", &Spline::spline) 
     ; 
} 

所以在Python中,你可以使用:

from Spline.Spline import * 
operation = Spline() 
value, error_ = operation.spline(np.array(your_x_array), np.array(your_y_array), 0.01) 

的.cpp类:

#define NUMBER_OF_SAMPLES 14 
class Spline 
{ 
public: 
    boost::python::list spline(numeric::array& x_val, numeric::array& y_val, double look_up_val); 
}; 

然后在boost::python::list Spline::spline(numeric::array& x_val, numeric::array& y_val, double p)功能你得到:

PyArrayObject* x_pyArr = (PyArrayObject*)PyArray_FROM_O(x_val.ptr()); 

PyArrayObject* y_pyArr = (PyArrayObject*)PyArray_FROM_O(y_val.ptr()); 
int size = *(x_pyArr->dimensions), i , j;  
double* data_x = (double*)x_pyArr->data; 
double* data_y = (double*)y_pyArr->data; 
double h[NUMBER_OF_SAMPLES], a, b, c, d, s[NUMBER_OF_SAMPLES] = { 0 }, F[NUMBER_OF_SAMPLES], f[NUMBER_OF_SAMPLES], x[NUMBER_OF_SAMPLES], m[NUMBER_OF_SAMPLES][NUMBER_OF_SAMPLES] = { 0 }, temp; 

for (int i = 0; i < size; i++) 
{ 
    x[i] = *(data_x + i); 
    f[i] = *(data_y + i); 
} 

依照代码中的链接。我在我的Spline::spline函数中返回一个python列表:

boost::python::list return_val; 
// .... 
return_val.append(sum); 
return_val.append(result); 
return return_val; 
相关问题