20

pythonOCC でスプラインを使用する方法について 2 つの部分からなる質問があります。

まず、スプラインを作成できることを知っています

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. Bスプラインの微分?
  2. Bスプラインの結び目?
  3. ノットは pt2d_list ですか?
  4. Bスプラインの制御点?
  5. スプラインの係数?

Bスプラインのノットを削除または追加するにはどうすればよいですか?

次に、次のように 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スプライン、係数などの形状からデータを取得するにはどうすればよいですか?

4

2 に答える 2

1

私はこれをpython-boost達成するために使用しました。この関数をチェックしてください: http://letslearncomputing.blogspot.com/2013/04/c-program-for-cubic-spline-interpolation.html ここで、目的の 5 つの値の一部を取得できます。

C++コードを(not 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;
于 2016-10-04T11:26:32.593 に答える
0

scipy のドキュメントを見て、適用しようとしている機能を検索します。

于 2015-05-15T12:11:15.170 に答える