首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在pythonOCC中使用样条线?

如何在pythonOCC中使用样条线?
EN

Stack Overflow用户
提问于 2013-10-14 16:41:33
回答 2查看 1.8K关注 0票数 20

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

首先,我知道我可以用来创建一个样条曲线

代码语言:javascript
复制
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样条函数可以用以下公式计算

代码语言:javascript
复制
BSPL1      = Geom2dAPI_PointsToBSpline(pt2d_list)

但是,我如何获得:

B样条的导数?

  • b样条的结?

  • Is the knots ? pt2d_list?

  • The control point?

  • 样条的系数?

以及如何删除或添加节点到B样条曲线?

其次,在pythonOCC中加载CAD绘图.stp文件时,如下所示:

代码语言:javascript
复制
from OCC import TopoDS, StlAPI
shape = TopoDS.TopoDS_Shape()
stl_reader = StlAPI.StlAPI_Reader()
stl_reader.Read(shape,str(filename))
display.DisplayShape(shape)

如何从形状中获取数据,如结、b样条和系数。

EN

回答 2

Stack Overflow用户

发布于 2016-10-04 19:26:33

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

您只需要将代码修改为C++ (而不是C)

代码语言:javascript
复制
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中,您可以使用:

代码语言:javascript
复制
from Spline.Spline import *
operation = Spline()
value, error_ = operation.spline(np.array(your_x_array), np.array(your_y_array), 0.01)

Cpp类:

代码语言:javascript
复制
#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)函数中,你会得到:

代码语言:javascript
复制
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列表:

代码语言:javascript
复制
boost::python::list return_val;
// ....
return_val.append(sum);
return_val.append(result);
return return_val;
票数 1
EN

Stack Overflow用户

发布于 2015-05-15 20:11:15

我会看一看scipy documentation,在那里搜索你想要应用的函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19356410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档