Comment utiliser splines en pythonOCC?
j'ai une question en deux parties sur l'utilisation de splines en pythonOCC.
tout d'Abord, je sais que je peux créer une spline avec
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)
Et j'attends que le bspline peut être calculée par
BSPL1 = Geom2dAPI_PointsToBSpline(pt2d_list)
mais comment obtenir:
- le dérivé de la bspline?
- les noeuds de La bspline?
- the knots is the pt2d_list?
- Les points de contrôle de la bspline?
- le coefficients de la spline?
et comment puis-je enlever ou ajouter des noeuds à la bspline?
Deuxièmement, lors du chargement D'un dessin CAD .fichier stp en pythonOCC comme ceci:
from OCC import TopoDS, StlAPI
shape = TopoDS.TopoDS_Shape()
stl_reader = StlAPI.StlAPI_Reader()
stl_reader.Read(shape,str(filename))
display.DisplayShape(shape)
Comment puis-je obtenir les données de la forme comme noeud, bspline, et les coefficients.
2 réponses
j'ai utilisé le python-boost
le faire parvenir.
Découvrez cette fonction: http://letslearncomputing.blogspot.com/2013/04/c-program-for-cubic-spline-interpolation.html
Vous pouvez obtenir ici quelques-unes de vos 5 valeurs souhaitées.
Vous avez juste besoin de modifier le code à C++
(pas 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)
;
}
Donc en Python, vous pouvez utiliser:
from Spline.Spline import *
operation = Spline()
value, error_ = operation.spline(np.array(your_x_array), np.array(your_y_array), 0.01)
Classe 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);
};
Puis boost::python::list Spline::spline(numeric::array& x_val, numeric::array& y_val, double p)
la fonction que vous obtenez:
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);
}
Et ainsi de suite selon le code dans le lien. Je retourne une liste python dans mon Spline::spline
fonction:
boost::python::list return_val;
// ....
return_val.append(sum);
return_val.append(result);
return return_val;
je voudrais prendre un coup d'oeil à scipy documentation et y chercher les fonctions que vous essayez d'appliquer.